我使用 SQL 中的 LAG() 函数来计算每个出租车司机当月小费总和与上个月小费总和之间的差异。然而,LAG() 函数为每一行返回 0,即使应该有先前的行可供引用。
这是我现在使用的查询示例:
SELECT
td.taxi_id,
td.year,
td.month,
td.tips_sum,
(td.tips_sum -
LAG(td.tips_sum, 1, 0) OVER (PARTITION BY td.taxi_id ORDER BY td.year, td.month) /
NULLIF(LAG(td.tips_sum, 1, 0) OVER (PARTITION BY td.taxi_id ORDER BY td.year, td.month), 0) AS tips_change
FROM
tips_data td
ORDER BY
td.tips_sum DESC
LIMIT 3
如果您几个月都没有相同
taxi_id
的数据,那您就不走运了。通过两个出租车标识符的小数据剪切,三个月的数据,我确实得到了一些非空值:
WITH tips_data(taxi_id,yr,mth,tips_sum) AS (
SELECT '85b7bf73-4c23-4beb-a938-339fe398f28a'::UUID,2018,3,1812.83
UNION ALL SELECT 'ddd74ec0-f15c-437c-923f-26a486ad9500'::UUID,2018,3,1617.57
UNION ALL SELECT '85b7bf73-4c23-4beb-a938-339fe398f28a'::UUID,2018,4,1812.83
UNION ALL SELECT 'ddd74ec0-f15c-437c-923f-26a486ad9500'::UUID,2018,4,1617.57
UNION ALL SELECT '85b7bf73-4c23-4beb-a938-339fe398f28a'::UUID,2018,5,1812.83
UNION ALL SELECT 'ddd74ec0-f15c-437c-923f-26a486ad9500'::UUID,2018,5,1617.57
)
SELECT
td.taxi_id
, td.yr
, td.mth
, td.tips_sum
, td.tips_sum -
LAG(td.tips_sum, 1, 0) OVER (PARTITION BY td.taxi_id ORDER BY td.yr, td.mth) /
NULLIF(LAG(td.tips_sum, 1, 0) OVER (PARTITION BY td.taxi_id ORDER BY td.yr, td.mth), 0) AS tips_change
FROM
tips_data AS td
ORDER BY
td.tips_sum DESC
-- out taxi_id | yr | mth | tips_sum | tips_change
-- out --------------------------------------+------+-----+----------+----------------------
-- out 85b7bf73-4c23-4beb-a938-339fe398f28a | 2018 | 3 | 1812.83 |
-- out 85b7bf73-4c23-4beb-a938-339fe398f28a | 2018 | 4 | 1812.83 | 1811.830000000000000
-- out 85b7bf73-4c23-4beb-a938-339fe398f28a | 2018 | 5 | 1812.83 | 1811.830000000000000
-- out ddd74ec0-f15c-437c-923f-26a486ad9500 | 2018 | 3 | 1617.57 |
-- out ddd74ec0-f15c-437c-923f-26a486ad9500 | 2018 | 4 | 1617.57 | 1616.570000000000000
-- out ddd74ec0-f15c-437c-923f-26a486ad9500 | 2018 | 5 | 1617.57 | 1616.570000000000000