SAP HANA:两个订单之间的天数

时间:2017-06-09 15:20:53

标签: mysql sql hana

这是我的表,我正在尝试通过加入相同的表与左连接和组与最小差异之间的日子。我没那么成功。

 Customer|Order|Date
    1    | 1   |Date1
    1    | 2   |Date2
    1    | 3   |Date3
    1    | 4   |Date4
    2    | 1   |Date1
    2    | 2   |Date3
    2    | 3   |Date6
    3    | 1   |Date3
    3    | 2   |Date5

要求是:

 Customer|Order|Date |diff
    1    | 1   |Date1| 0
    1    | 2   |Date2| days_betwen(Date2, Date1)
    1    | 3   |Date3| days_betwen(Date3, Date2)
    1    | 4   |Date4| days_betwen(Date4, Date3)
    2    | 1   |Date1| 0
    2    | 2   |Date3| days_betwen(Date3, Date1)
    2    | 3   |Date6| days_betwen(Date6, Date3)
    3    | 1   |Date3| 0
    3    | 2   |Date5| days_betwen(Date5, Date3)

我需要有逻辑部分的建议!

编辑:如果订单号不是连续的,该怎么办?

1 个答案:

答案 0 :(得分:1)

首先,您需要通过CustomerOrder字段将表格加入自身。然后使用DATEDIFF()函数获取两个日期之间的天数。

  1. 如果Order列按顺序编号,则解决方案最简单:

    SELECT 
      cur.`Customer` AS `Customer`,
      cur.`Order` AS `Order`, 
      cur.`Date` AS `Date`, 
      DATEDIFF(cur.`Date`, IFNULL(prv.`Date`, cur.`Date`)) AS `DaysPassed`
    FROM 
      MyTable cur
      LEFT JOIN 
      MyTable prv
      ON cur.`Customer` = prv.`Customer` AND cur.`Order` = prv.`Order`+ 1;
    
  2. 如果Order列没有按顺序编号,但下一个Order值大于之前,那么您可以使用大于更少比运营商。使用GROUP BY子句和聚合函数为每个订单返回单行。注意,也许会很长!

    SELECT 
        comb.`Customer` AS `Customer`,
        comb.`curOrder` AS `Order`, 
        comb.`curDate` AS `Date`, 
        DATEDIFF(comb.`curDate`, IFNULL(pr.`Date`, comb.`curDate`)) AS `DaysPassed`
    FROM
        (SELECT 
          cur.`Customer` AS `Customer`, cur.`Order` AS curOrder, cur.`curDate` AS `Date`, max(prv.`Order`) AS `prvOrder`
        FROM 
          MyTable cur
          LEFT JOIN 
          MyTable prv
          ON cur.`Customer` = prv.`Customer` AND cur.`Order` > prv.`Order`
          GROUP BY cur.`Order`, cur.`Customer`) comb
        LEFT JOIN
        MyTable pr 
        ON pr.`Customer` = comb.`Customer` AND pr.`Order` = comb.prvOrder;
    
  3. 如果您使用随机订单号,则可以在Date子查询中使用Order列而不是comb来按相同客户的最近订单日期加入记录

  4. 祝你好运!