如何在使用Group By时区分记录?

时间:2011-05-05 14:43:16

标签: sql oracle group-by

喂, 我有桌子(见下图),有4条记录。请注意,ColumnA和ColumnB具有相同的值,ColumnC和columnD将具有不同的值。

ColumnA ColumnB ColumnC ColumnD
------- ------- ------- -------
xx      yy      AAA     333
xx      yy      BBB     555
xx      yy      AAA     333
xx      yy      BBB     555

我试图使用Group By查询选择整个记录,如下所示:

SELECT ColumnC from TableA GROUP BY ColumnC;

此查询仅向我显示ColumnC,但我的期望是不仅选择整个记录ColumnC。

更新:我的预期输出是:

ColumnA ColumnB ColumnC ColumnD
------- ------- ------- -------
xx      yy      AAA     333
xx      yy      BBB     555

我可以知道我该怎么做?

谢谢@!

5 个答案:

答案 0 :(得分:4)

您可以将所有列放在SELECT和GROUP BY子句中:

SELECT 
    ColumnA, ColumnB, ColumnC, ColumnD 
FROM 
    TableA 
GROUP BY
    ColumnA, ColumnB, ColumnC, ColumnD

这基本上等同于

SELECT DISTINCT
    *
FROM
    TableA

但更明确。正如OMG Ponies所指出的,语法可以在DBMS之间变化。在某些情况下,您可以简单地做:

SELECT * FROM TableA GROUP BY ColumnC

答案 1 :(得分:2)

在Oracle中:

SELECT  *
FROM    (
        SELECT  t.*,
                ROW_NUMBER() OVER (PARTITION BY columnC ORDER BY columnA) AS rn
        FROM    mytable
        )
WHERE   rn = 1

更改ORDER BY子句以控制将返回包含重复项的记录(现在columnA的值最小)。

答案 2 :(得分:1)

如果您使用的是MS SQL,以下内容可以满足您的需求:SELECT ColumnC,* from TableA GROUP BY ColumnC;

在Oracle中,我相信select ColumnC, TableA.* from TableA GROUP BY COLUMNC;会帮助你。

答案 3 :(得分:0)

SELECT * from TableA GROUP BY ColumnC;

答案 4 :(得分:0)

您可能希望选择所有列,然后需要将列C排在第一位: SELECT * FROM TableA GROUP BY ColumnC,ColumnA,ColumnB,ColumnD