根据另一列选择具有最高ID的行

时间:2013-10-30 12:02:53

标签: sql sql-server-2008 greatest-n-per-group

在SQL Server 2008 R2中,假设我有一个像这样的表格布局......

+----------+---------+-------------+
| UniqueID | GroupID | Title       |
+----------+---------+-------------+
|    1     |    1    | TEST 1      |
|    2     |    1    | TEST 2      |
|    3     |    3    | TEST 3      |
|    4     |    3    | TEST 4      |
|    5     |    5    | TEST 5      |
|    6     |    6    | TEST 6      |
|    7     |    6    | TEST 7      |
|    8     |    6    | TEST 8      |
+----------+---------+-------------+

是否可以为每个GroupID选择具有最高UniqueID编号的每一行。所以根据上面的表格 - 如果我运行查询,我会期待这个......

+----------+---------+-------------+
| UniqueID | GroupID | Title       |
+----------+---------+-------------+
|    2     |    1    | TEST 2      |
|    4     |    3    | TEST 4      |
|    5     |    5    | TEST 5      |
|    8     |    6    | TEST 8      |
+----------+---------+-------------+

已经暂时停留了一段时间,但似乎无法破解它。

非常感谢,

5 个答案:

答案 0 :(得分:3)

SELECT * 
FROM   (SELECT uniqueid,  groupid,  title, 
               Row_number() 
                 OVER ( partition BY groupid ORDER BY uniqueid DESC) AS rn 
        FROM   table) a 
WHERE  a.rn = 1 

答案 1 :(得分:2)

由于您未提及任何RDBMS,因此下面的此语句几乎适用于所有RDBMS。子查询的目的是为每个uniqueID获得最大的GROUPID。为了能够获取其他列,子查询的结果将连接在原始表上。

SELECT  a.*
FROM    tableName a
        INNER JOIN
        (
            SELECT  GroupID, MAX(uniqueID) uniqueID
            FROM    tableName
            GROUP   By GroupID
        ) b ON a.GroupID = b.GroupID
                AND a.uniqueID = b.uniqueID

如果您的RDBMS支持Qnalytic功能,您可以使用ROW_NUMBER()

SELECT uniqueid,  groupid,  title
FROM   
(
SELECT uniqueid,  groupid,  title, 
        ROW_NUMBER() OVER (PARTITION BY groupid 
                           ORDER BY uniqueid DESC)  rn 
FROM   tableName
) x
WHERE  x.rn = 1 

ROW_NUMBER()会生成您可以过滤掉的序号。在这种情况下,序列号在groupid上生成,并按uniqueid降序排序。最高uniqueid1中的值为rn

答案 2 :(得分:2)

使用SQL-Server作为rdbms,您可以使用排名函数,如ROW_NUMBER

WITH CTE AS
(
    SELECT UniqueID, GroupID, Title,
       RN = ROW_NUMBER() OVER (PARTITON BY GroupID
                               ORDER BY UniqueID DESC)
    FROM dbo.TableName
)
SELECT UniqueID, GroupID, Title
FROM CTE
WHERE RN = 1

这会为每个GroupID返回一条记录,即使有多行具有最高UniqueID(名称不建议如此)。如果您想要返回所有行,请使用DENSE_RANK代替ROW_NUMBER

您可以在此处查看所有功能及其工作原理:http://technet.microsoft.com/en-us/library/ms189798.aspx

答案 3 :(得分:1)

SELECT *
FROM the_table tt
WHERE NOT EXISTS (
    SELECT *
    FROM the_table nx
    WHERE nx.GroupID = tt.GroupID
    AND nx.UniqueID > tt.UniqueID
    )
    ;
  • 应该在任何DBMS中工作(不需要窗口功能或CTE)
  • 可能比使用聚合
  • 的子查询更快

答案 4 :(得分:0)

保持简单:

select * from test2
where UniqueID in (select max(UniqueID) from test2 group by GroupID)


Considering:

create table test2
(
UniqueID numeric,
GroupID numeric,
Title varchar(100)
)

insert into test2 values(1,1,'TEST 1')
insert into test2 values(2,1,'TEST 2')
insert into test2 values(3,3,'TEST 3')
insert into test2 values(4,3,'TEST 4')
insert into test2 values(5,5,'TEST 5')
insert into test2 values(6,6,'TEST 6')
insert into test2 values(7,6,'TEST 7')
insert into test2 values(8,6,'TEST 8')