Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MSSQL-选择表中多行的最新匹配项_Sql_Sql Server_Tsql - Fatal编程技术网

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;