2017-10-16 11 views
3

所以,我把头撞在墙壁上... 我有一张表(几百万行)看起来像这样:MSSQL - 选择表格中最近出现的几行

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; 导致这样的事情:

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 

如果任何人都可以给我一个线索,这将是真棒!

回答

3

另一个选择(没有子查询和/或额外的字段)

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 
3

你可以使用ROW_NUMBER

SELECT * FROM (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY Area ORDER BY Time DESC) AS rn 
    FROM table) sub 
WHERE rn = 1 
1

lad2025是正确的。

更具体到您的特定标识要求,使用

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 
1

或者更老派的做法是使用派生表中的GROUP BY