我有一个包含Orders
的表,可以在同一天内为给定的Name
创建多个订单。我需要返回给定日期和名称的最新Order,如果当天有一个名称的多个订单,请返回最大订单值的订单。
样本数据:
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
返回的结果应该是:
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查询中执行此操作,但是是否可以通过简单查询来实现上述结果?
答案 0 :(得分:4)
启动SQL Server 2005,只需使用::before
:
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。
对于较旧的版本,一种过滤表的解决方案是使用具有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
条件确保对于相同的OrderValue
和Name
,没有其他记录具有最高的OrderDate
。
答案 1 :(得分:0)
使用# Delete everything on destination dir
rsync -zavr --delete /dev/null user@host:dest_dir/
# Now iterate over all input directories (could use a for loop)
rsync -zavr ./input_dir_1/ user@host:dest_dir/
rsync -zavr ./input_dir_2/ user@host:dest_dir/
rsync -zavr ./input_dir_3/ user@host:dest_dir/
:
cross apply