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

时间:2019-03-14 22:54:09

标签: sql sql-server

我有一个包含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查询中执行此操作,但是是否可以通过简单查询来实现上述结果?

2 个答案:

答案 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的相同OrderDateOrderValue的记录组中的每个记录分配一个等级。顺序值最高的记录的行号为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条件确保对于相同的OrderValueName,没有其他记录具有最高的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