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

Mysql SAP HANA:两个订单之间的天数,mysql,sql,hana,Mysql,Sql,Hana,这是我拥有的表,我试着在两天之间用左join连接同一个表,用最小差异分组。我没有那么成功 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

这是我拥有的表,我试着在两天之间用左join连接同一个表,用最小差异分组。我没有那么成功

 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)
我需要逻辑部分的建议


编辑:如果订单号不连续怎么办?

首先,您需要通过
Customer
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;
    
  • 如果
    Order
    列未按顺序编号,但next
    Order
    值大于previous,则可以使用大于或小于运算符。使用
    GROUPBY
    子句和聚合函数为每个订单返回单行。注意,可能会很长

    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;
    
  • 如果使用随机订单号,则可以在
    comb
    子查询中使用
    Date
    列而不是
    order
    ,按同一客户最近的订单日期联接记录


  • 祝你好运

    看:@草莓谢谢!我将按照我下一个关于病房的问题的三个步骤进行。我担心这可能非常非常快。你所说的
    那是什么意思?
    ?那非常聪明和整洁!如果订单号不连续怎么办?@Sai,那就很难了!您可以尝试使用索引行。但我不确定它是否会被用在JOIN子句中。这正是我在考虑你们非常聪明的解决方案后所想的。我必须在星期一检查!检查后我会给你留言。谢谢你的好主意。你好,赛!你的麻烦解决了吗?我对我的回答补充了一些建议。请写下对你有帮助的东西。嗨,我还没有机会尝试,我希望明天我能在我的工作站上。您现在提供的解决方案与我尝试过的类似。由于您之前的建议非常酷,我正在考虑使用
    rownumber()分区覆盖order
    ,并使用酷的连接逻辑。然而,一旦我在我的工作站上,我将尝试这两种方法。谢谢你,伙计!