MSSQL-选择表中多行的最新匹配项
所以,这一次我的头撞到了墙上。。。 我有一个表(几百万行),看起来像这样:MSSQL-选择表中多行的最新匹配项,sql,sql-server,tsql,Sql,Sql Server,Tsql,所以,这一次我的头撞到了墙上。。。 我有一个表(几百万行),看起来像这样: ID Time Area Name 1 2017-01-01 01:42 21 Test 1 2017-01-02 02:13 21 Test 1 2017-02-01 12:45 30 N/A 1 2017-03-12 02:23 41 N/A 2 2017-02-15 04:25 20 N/A ID Time
ID Time Area Name
1 2017-01-01 01:42 21 Test
1 2017-01-02 02:13 21 Test
1 2017-02-01 12:45 30 N/A
1 2017-03-12 02:23 41 N/A
2 2017-02-15 04:25 20 N/A
ID Time Area Name
1 2017-01-02 02:13 21 Test
1 2017-02-01 12:45 30 N/A
1 2017-03-12 02:23 41 N/A
select max(Time),
"of every area"
from TABLE
where ID = 1
我想运行一个查询,选择某个ID的最新出现的区域;
结果是这样的:
ID Time Area Name
1 2017-01-01 01:42 21 Test
1 2017-01-02 02:13 21 Test
1 2017-02-01 12:45 30 N/A
1 2017-03-12 02:23 41 N/A
2 2017-02-15 04:25 20 N/A
ID Time Area Name
1 2017-01-02 02:13 21 Test
1 2017-02-01 12:45 30 N/A
1 2017-03-12 02:23 41 N/A
select max(Time),
"of every area"
from TABLE
where ID = 1
如果有人能给我一个线索,那就太棒了 您可以使用
行号
:
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER(PARTITION BY Area ORDER BY Time DESC) AS rn
FROM table) sub
WHERE rn = 1
还有一个选项(sans子查询和/或额外字段)
示例
Select Top 1 with Ties *
From YourTable
Where ID =1
Order By Row_Number() over (Partition By Area Order By [Time] Desc)
返回
ID Time Area Name
1 2017-01-02 02:13:00.000 21 Test
1 2017-02-01 12:45:00.000 30 N/A
1 2017-03-12 02:23:00.000 41 N/A
这是正确的
要更具体地满足您对特定ID的要求,请使用
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER(PARTITION BY Area ORDER BY Time DESC) AS rn
FROM table WHERE ID=1) sub
WHERE rn = 1
使用CTE,您可以使用与相同的
;WITH cte AS (
SELECT [ID], [Time], [Area], [Name],
row_number() OVER(PARTITION BY [Area] ORDER BY [Time] desc) AS [rn]
FROM [AreaTable] WHERE ID=1
)
SELECT [ID], [Time], [Area], [Name] FROM cte WHERE [rn] = 1
或者更老派的方法是在派生表中使用GROUPBY
SELECT Test.* FROM dbo.testTable Test
INNER JOIN (
SELECT Id, MAX(Time) Time, Area
FROM dbo.testTable
GROUP BY Id, Area
) TestMax ON TestMax.Id = Test.Id AND TestMax.Time = Test.Time AND
TestMax.Area = Test.Area
ORDER BY Test.Id, Test.Area;