获取 SQL 中的最大行和最新行

Getting max and latest rows in SQL

我有一个包含 Orders 的 table,其中可以在同一天为给定的 Name 创建多个订单。我需要 return 给定日期和姓名的最新订单,如果同一天有多个订单,则 return 订单价值最大的订单。

示例数据:

  ID  | NAME |  OrderDate   |   OrderValue
  ----+------+--------------+--------------
  1   | A    | 2019-01-15   |   100
  2   | B    | 2019-01-15   |   200
  3   | A    | 2019-01-15   |   150
  4   | C    | 2019-01-17   |   450
  5   | D    | 2019-01-18   |   300
  6   | C    | 2019-01-17   |   500

结果 returned 应该是:

  ID  | NAME |  OrderDate   |   OrderValue
  ----+------+--------------+--------------
  2   | B    | 2019-01-15   |   200
  3   | A    | 2019-01-15   |   150
  5   | D    | 2019-01-18   |   300
  6   | C    | 2019-01-17   |   500

我可以在多个 SQL 查询中执行此操作,但是是否有一个简单的查询可以实现上述结果?

正在启动 SQL Server 2005,只需使用 ROW_NUMBER():

SELECT ID, Name, OrderDate, OrderValue
FROM (
    SELECT 
        o.*, 
        ROW_NUMBER() OVER(PARTITION BY Name, OrderDate ORDER BY OrderValue DESC) rn
    FROM orders o
) x WHERE rn = 1

ROW_NUMBER() 为具有相同 NameOrderDate 的记录组中的每条记录分配排名,按 OrderValue 排序。订单值最高的记录获得行号 1。


对于旧版本,过滤 table 的解决方案是使用具有 NOT EXITS 条件的相关子查询:

SELECT ID, Name, OrderDate, OrderValue
FROM orders o
WHERE NOT EXISTS (
    SELECT 1 
    FROM orders o1
    WHERE 
        o1.Name = o.Name 
        AND o1.OrderDate = o.OrderDate 
        AND o1.OrderValue > o.OrderValue
)

NOT EXISTS条件确保没有其他记录具有相同NameOrderDate的最高OrderValue

使用cross apply:

select  o.id,  name, orderdate, o.ordervalue
from orders o
cross apply (select top 1 id, ordervalue from orders where name=o.name and orderdate=o.OrderDate order by ordervalue desc) oo
where o.id=oo.id
order by o.id