获取 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()
为具有相同 Name
和 OrderDate
的记录组中的每条记录分配排名,按 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
条件确保没有其他记录具有相同Name
和OrderDate
的最高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
我有一个包含 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()
为具有相同 Name
和 OrderDate
的记录组中的每条记录分配排名,按 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
条件确保没有其他记录具有相同Name
和OrderDate
的最高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