我有以下记录:
Col_1 | Col_2 | Col_3
------+-------+------
A | A | XYZ01
A | A | XYZ02
A | A | XYZ03
A | B | XYZ04
B | B | XYZ05
B | B | XYZ06
B | B | XYZ07
B | B | XYZ08
我需要一个最多返回2条记录的查询,其中Col_1和Col_2是不同的(不管Col_3)(应该是每个不同col_1,col_2组合的2个记录样本)。
所以这个查询应该返回:
Col_1 | Col_2 | Col_3
------+-------+------
A | A | XYZ01
A | A | XYZ02
A | B | XYZ04
B | B | XYZ05
B | B | XYZ06
答案 0 :(得分:3)
SELECT *
FROM (
SELECT col_1
,col_2
,col_3
,row_number() OVER (
PARTITION BY col_1
,col_2 ORDER BY col_1
) AS foo
FROM TABLENAME
) bar
WHERE foo < 3
Top命令不起作用,因为您想要“分组”多列。有用的是分区数据并为分区数据分配行号。通过在col_1和col_2上进行分区,我们可以创建3个不同的分组。
1. col_1中所有带'a'的行 2. col_2中所有行'b'的行 3 col_1中的所有行都带有'a'和'b',col_2为
我们将按col_1订购(我选择了这个,因为您的结果集是按a排序的)。然后,对于该分组中的每一行,我们将计算行数并显示行号。
我们将此信息用作派生表,并从此派生表中选择*,其中rownumber小于3.这将使我们得到每个分组中的前两个元素
答案 1 :(得分:0)
至于Oracle使用Rank会起作用。
Select * From (SELECT Col_1 ,
Col_2 ,
Col_3 ,
RANK() OVER (PARTITION BY Col_1, Col_2 ORDER BY Col_1 ) part
FROM someTable ) st where st.part < 2;
因为我被提醒你不能在原来的where子句中使用别名,所以我做了一个仍然有效的改变,虽然可能不是最优雅的。