SQL查询只显示几条DISTINCT记录

时间:2014-07-30 20:02:08

标签: sql oracle

我有以下记录:

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

2 个答案:

答案 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子句中使用别名,所以我做了一个仍然有效的改变,虽然可能不是最优雅的。