SQL LAG() 函数为每一行返回 0,尽管先前的行可用

问题描述 投票:0回答:1

我使用 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

Example of the result I get right now

sql google-bigquery window-functions
1个回答
0
投票

如果您几个月都没有相同

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
© www.soinside.com 2019 - 2024. All rights reserved.