选择一天的一条记录

时间:2014-06-25 20:48:58

标签: sql sql-server tsql

以下查询为我提供了针对三个网站的订单日期的地址。 如果我为网站完成了多个订单,我只想选择该网站的最新记录

SELECT DISTINCT ORDERS.Address, ORDERS.ORDERDATE  
FROM ORDERS
Left JOIN PHONEDATA AS P
   ON ORDERS.RECID = P.OrderID
where client IN ('site1','site2','site3')

结果

Address orderdate
------- -----------------------
Site1   2014-02-13 14:58:22.427
site1   2014-02-13 14:48:57.413
site1   2014-02-13 15:03:32.403
Site2   2014-02-13 13:48:22.427
site2   2014-02-13 13:30:57.413
site2   2014-02-13 13:03:32.403
Site3   2014-02-13 14:12:22.427
site3   2014-02-13 11:10:57.413
site3   2014-02-13 13:03:32.403
Site1   2014-02-14 14:58:22.427
site1   2014-02-14 14:48:57.413
site1   2014-02-14 15:03:32.403
Site2   2014-02-14 13:48:22.427
site2   2014-02-14 13:30:57.413
site2   2014-02-14 13:03:32.403
Site3   2014-02-14 14:12:22.427
site3   2014-02-14 11:10:57.413
site3   2014-02-14 13:03:32.403

预期结果

site1   2014-02-13 15:03:32.403
Site2   2014-02-13 13:48:22.427
Site3   2014-02-13 14:12:22.427
site1   2014-02-14 15:03:32.403
Site2   2014-02-14 13:48:22.427
Site3   2014-02-14 14:12:22.427

所以选择最新记录

更新:抱歉,我应该提到的,我想要那天的最新价值。 我已经更新了预期的结果,因此我不想选择site1的最新值,而是要显示给定日期的网站1的最新值,如果该网站有值,则每天重复一次

3 个答案:

答案 0 :(得分:1)

试试这个:

SELECT ORDERS.Address, MAX(ORDERS.ORDERDATE) AS ORDERDATE
FROM ORDERS O
LEFT JOIN PHONEDATA AS P
   ON O.RECID = P.OrderID
WHERE client IN ('site1','site2','site3')
GROUP BY ORDERS.Address

答案 1 :(得分:1)

使用以下查询:

SELECT ORDERS.Address, MAX(ORDERS.ORDERDATE)
FROM ORDERS
Left JOIN PHONEDATA AS P
   ON ORDERS.RECID = P.OrderID
where client IN ('site1','site2','site3')
GROUP BY ORDERS.Address, CAST(ORDERS.OrderDate AS DATE)

答案 2 :(得分:0)

假设client表中有orders

SELECT o.Address, o.ORDERDATE  
FROM (select o.*, row_number() over (partition by client order by orderdate desc) as seqnum
      from ORDERS o
     ) o Left JOIN
     PHONEDATA  P
     ON o.RECID = P.OrderID
where o.client IN ('site1', 'site2', 'site3') and
      o.seqnum = 1;

请注意,这将为您提供最新订单的地址以及日期。

编辑:

修改上述内容以便每天处理最近的事情很容易。唯一的变化是seqnum

的定义
SELECT o.Address, o.ORDERDATE  
FROM (select o.*, row_number() over (partition by client, cast(orderdate as date)
                                     order by orderdate desc
                                    ) as seqnum
      from ORDERS o
     ) o Left JOIN
     PHONEDATA  P
     ON o.RECID = P.OrderID
where o.client IN ('site1', 'site2', 'site3') and
      o.seqnum = 1;