选择唯一记录

时间:2013-10-07 15:47:53

标签: sql oracle greatest-n-per-group

我正在使用一个包含大约50个列和100,000行的表。

一列称之为TypeID,有10个可能的值:

1 thourgh 10。

可以有10,000个TypeID = 1的记录,以及10,000个TypeID = 2的记录,因此只有一个。

我想运行一个SELECT语句,它将返回每个不同TypeID的1条记录。

类似

TypeID    JobID    Language    BillingDt    etc
------------------------------------------------
1         123      EN          20130103     etc
2         541      FR          20120228     etc
3         133      FR          20110916     etc
4         532      SP          20130822     etc
5         980      EN          20120714     etc
6         189      EN          20131009     etc
7         980      SP          20131227     etc
8         855      EN          20111228     etc
9         035      JP          20130615     etc
10        103      EN          20100218     etc

我试过了:

SELECT DISTINCT TypeID, JobID, Language, BillingDt, etc

但是会生成多个具有相同值的TypeID行。我得到了一大堆'4','10'等等。

这是我正在使用的ORACLE数据库。

任何建议都将不胜感激;谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用ROW_NUMBER()获取每组前n名:

SELECT  TypeID, 
        JobID, 
        Language, 
        BillingDt, 
        etc
FROM    (   SELECT  TypeID, 
                    JobID, 
                    Language, 
                    BillingDt, 
                    etc,
                    ROW_NUMBER() OVER(PARTITION BY TypeID ORDER BY JobID) RowNumber
            FROM    T
        ) T
WHERE   RowNumber = 1;

<强> SQL Fidle

您可能需要更改ORDER BY子句以满足您的要求,因为您没有说过如何根据我必须猜测的TypeID选择一行。

答案 1 :(得分:0)

WITH RankedQuery AS
(
   SELECT *,
         ROW_NUMBER() OVER (PARTITION BY TypeID ORDER BY [ordercolumn] DESC) AS rn
   FROM         [table]
)
SELECT *
FROM RankedQuery
WHERE rn = 1;

这将返回每个类型ID的第一行,如果您想要特定行而不是任何行,则可以添加订单。