SQL Server:仅选择MAX行(DATE)

GEM*_*EMI 97 sql-server

我有一个数据表(db是MSSQL):

    ID  OrderNO PartCode  Quantity DateEntered
    417 2144     44917    100      18-08-11
    418 7235     11762    5        18-08-11
    419 9999     60657    100      18-08-11
    420 9999     60657    90       19-08-11
Run Code Online (Sandbox Code Playgroud)

我想创建一个返回OrderNO,PartCode和Quantity的查询,但仅用于最后一次注册的订单.

从示例表中我想获得以下信息:

     OrderNO PartCode  Quantity     
     2144     44917    100      
     7235     11762    5        
     9999     60657    90      
Run Code Online (Sandbox Code Playgroud)

请注意,订单9999只返回了一行.

谢谢!

Mik*_*son 166

如果rownumber() over(...)你可以....

select OrderNO,
       PartCode,
       Quantity
from (select OrderNO,
             PartCode,
             Quantity,
             row_number() over(partition by OrderNO order by DateEntered desc) as rn
      from YourTable) as T
where rn = 1      
Run Code Online (Sandbox Code Playgroud)

  • 感谢Mikael Eriksson,这是一个了不起的查询! (2认同)

Mat*_*lie 55

最好的方法是Mikael Eriksson,如果ROW_NUMBER()可以的话.

根据Cularis的回答,接下来最好是加入查询.

或者,最简单直接的方法是WHERE子句中的相关子查询.

SELECT
  *
FROM
  yourTable AS [data]
WHERE
  DateEntered = (SELECT MAX(DateEntered) FROM yourTable WHERE orderNo = [data].orderNo)
Run Code Online (Sandbox Code Playgroud)

要么...

WHERE
  ID = (SELECT TOP 1 ID FROM yourTable WHERE orderNo = [data].orderNo ORDER BY DateEntered DESC)
Run Code Online (Sandbox Code Playgroud)


ton*_*one 27

select OrderNo,PartCode,Quantity
from dbo.Test t1
WHERE EXISTS(SELECT 1
         FROM dbo.Test t2
         WHERE t2.OrderNo = t1.OrderNo
           AND t2.PartCode = t1.PartCode
         GROUP BY t2.OrderNo,
                  t2.PartCode
         HAVING t1.DateEntered = MAX(t2.DateEntered))
Run Code Online (Sandbox Code Playgroud)

这是上面提供的所有查询中最快的.查询成本为0.0070668.

上面的首选答案是Mikael Eriksson,查询成本为0.0146625

您可能不关心这么小的样本的性能,但在大型查询中,它们都会增加.

  • 对于我来说,这对于~3.5M行数据集来说比其他解决方案略快一些,但SSMS提出了一个将执行时间缩短一半的索引.谢谢! (2认同)
  • 如果您的日期字段具有相同值 (04/15/2017) 的 2 个不同 ID,它将返回 2 行... (2认同)

Jac*_*cob 10

SELECT t1.OrderNo, t1.PartCode, t1.Quantity
FROM table AS t1
INNER JOIN (SELECT OrderNo, MAX(DateEntered) AS MaxDate
            FROM table
            GROUP BY OrderNo) AS t2
ON (t1.OrderNo = t2.OrderNo AND t1.DateEntered = t2.MaxDate)
Run Code Online (Sandbox Code Playgroud)

内部查询选择OrderNo具有最大日期的所有内容.要获取表格的其他列,您可以加入它们OrderNoMaxDate.


Mor*_*enB 5

如果你有索引 ID 和 OrderNo 你可以使用 IN: (我讨厌用简单性来换取晦涩难懂,只是为了节省一些周期):

select * from myTab where ID in(select max(ID) from myTab group by OrderNo);
Run Code Online (Sandbox Code Playgroud)