0

我有一种情况,如果下表中的值为 ,我想应用过滤器逻辑来获取前几条记录A

姓名 价值
测试 1 一种
测试 2 一种
测试 3 一种
测试 4 一种
测试 5 一种
测试 6
测试 7
测试 8
测试 9

如果我希望A在我选择记录时基于值的结果受到前 2 条记录的限制,我想要的结果,上表如下所示。关于如何做到这一点的任何想法?我应该考虑window功能吗?

姓名 价值
测试 1 一种
测试 2 一种
测试 6
测试 7
测试 8
测试 9
4

2 回答 2

2

是的,窗口函数会有所帮助。

with t as
(
 select *, row_number() over (partition by "Value" order by "Name") rn
 from the_table
)
select * from t
where ("Value" = 'A' and rn <= 2) or ("Value" <> 'A');
于 2021-11-16T18:04:13.097 回答
1

尝试使用“A”选择行并限制为 2 行的公用表表达式,以及使用“B”选择所有行的 UNION SELECT ...

WITH
indata(Name,Value) AS (
          SELECT 'Test 1','A'
UNION ALL SELECT 'Test 2','A'
UNION ALL SELECT 'Test 3','A'
UNION ALL SELECT 'Test 4','A'
UNION ALL SELECT 'Test 5','A'
UNION ALL SELECT 'Test 6','B'
UNION ALL SELECT 'Test 7','B'
UNION ALL SELECT 'Test 8','B'
UNION ALL SELECT 'Test 9','B'
)
,
a_rows AS (
  SELECT
    *
  FROM indata
  WHERE value='A'
  ORDER BY 1
  LIMIT 2
)
SELECT
  *
FROM a_rows
UNION ALL SELECT
  *
FROM indata
WHERE value='B'
;
-- out   Name  | Value 
-- out --------+-------
-- out  Test 1 | A
-- out  Test 2 | A
-- out  Test 6 | B
-- out  Test 7 | B
-- out  Test 8 | B
-- out  Test 9 | B                                                                                                                                                                     
于 2021-11-16T18:06:51.700 回答