在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 |
+----------+---------+-------------+
已经暂时停留了一段时间,但似乎无法破解它。
非常感谢,
答案 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
降序排序。最高uniqueid
在1
中的值为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
)
;
答案 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')