Mysql SAP HANA:两个订单之间的天数
这是我拥有的表,我试着在两天之间用左join连接同一个表,用最小差异分组。我没有那么成功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
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
列未按顺序编号,但nextOrder
值大于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
,并使用酷的连接逻辑。然而,一旦我在我的工作站上,我将尝试这两种方法。谢谢你,伙计!