I have a table more like this
+----+-------------+---------------------+
| id | order_id | transaction_date |
+----+-------------+---------------------+
| 1 | TEST000001 | 2018-01-01 00:00:10 |
| 2 | TEST000002 | 2018-01-01 00:10:10 |
| 3 | TEST000003 | 2018-01-02 03:18:01 |
| 4 | TEST000004 | 2018-02-04 05:00:00 |
| 5 | TEST000005 | 2018-02-10 16:00:10 |
+----+-------------+---------------------+
There is datetime field named transaction_date, so what I want to do is doing a calculation of time interval (day interval), so that I will get an average, minimum and maximum time interval for all records I have.
Sample expectation :
+------------------+------------------+------------------+
| average_interval | minimum_interval | maximum_interval |
+--------------------------------------------------------+
| 2.0 | 1 | 3 |
+------------------+------------------+------------------+
What I’ve done so far is using LAG() function more like the following SELECT script.
SELECT AVG(date_interval) AS average_interval,
MIN(date_interval) AS minimum_interval,
MAX(date_interval) AS maximum_interval
FROM (
SELECT
transaction_date - LAG(transaction_date)
OVER (PARTITION BY transaction_date ORDER BY id) AS date_interval
FROM transactions
) t;
But the outcome was far from my expectation, null result
I believe thats not a proper way to solve it, any suggestions ?
Advertisement
Answer
I am not confident about using - in MySQL. Use TIMESTAMPDIFF(). Your problem, however, is the PARTITION BY lcause:
SELECT AVG(date_interval) AS average_interval,
MIN(date_interval) AS minimum_interval,
MAX(date_interval) AS maximum_interval
FROM (SELECT TIMESTAMPDIFF(second, transaction_date,
LAG(transaction_date) OVER (ORDER BY transaction_date)
) AS date_interval
FROM transactions
) t;
