1

在 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      |
+----------+---------+-------------+

一直在咀嚼这个,但似乎无法破解它。

非常感谢,

4

5 回答 5

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 
于 2013-10-30T12:04:29.560 回答
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最大值uniqueid的值为1in rn

于 2013-10-30T12:04:25.680 回答
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

于 2013-10-30T12:06:02.690 回答
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)
  • 可能比带有聚合的子查询快
于 2013-10-30T12:12:14.650 回答
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')
于 2013-10-30T13:13:26.670 回答