簡體   English   中英

LAG function 替代品。 我需要介於兩者之間的缺失年份的結果

[英]LAG function alternative. I need the results for the missing year in between

到目前為止,我有這張桌子。 但是,我想獲得 2019 年沒有記錄的結果,所以它變為 0。是否有任何替代 LAG 功能的方法。

ID Year_Count
1 2018 10
1 2020 20

每當我在 SQL 中使用 LAG function 時,它都會給我 2018 年的結果。但是,我想得到 2019 年的 0 和 2018 年的 10

LAG(YEAR_COUNT) OVER (PARTITION BY ID ORDER BY YEAR) AS previous_year_count 

未經測試的記事本塗鴉

CASE
WHEN 1 = YEAR - LAG(YEAR) OVER (PARTITION BY ID ORDER BY YEAR) 
THEN LAG(YEAR_COUNT) OVER (PARTITION BY ID ORDER BY YEAR)
ELSE 0
END AS previous_year_count

我將在這里舉一個例子來補充尼克的評論。

這里的 YEARS CTE 正在按照他的建議創建那個年份表,RECORDS 表與上面發布的相匹配。 然后他們與 COALESCE 一起填寫 LEFT JOIN 留下的 null 值(用 0 填充 ID,不確定您的情況是什么)。

您需要 LEFT JOIN 到 YEAR 表和 select 在最終查詢中 YEAR 表中的 YEAR 變量,否則您最終只會得到 2018/2020 或那些年份和一些 null 值

WITH
  YEARS AS
(
  SELECT 2016 AS YEAR UNION ALL
  SELECT 2017 UNION ALL
  SELECT 2018 UNION ALL
  SELECT 2019 UNION ALL
  SELECT 2020 UNION ALL
  SELECT 2021  UNION ALL
  SELECT 2022   
)
,
  RECORDS AS
(
  SELECT 1 ID,  2018 YEAR,  10 YEAR_COUNT UNION ALL
  SELECT 1, 2020,   20)

SELECT 
 COALESCE(ID, 0) AS ID, 
 Y.YEAR, 
 COALESCE(YEAR_COUNT, 0) AS YEAR_COUNT
FROM YEARS AS Y
LEFT JOIN RECORDS AS R
ON R.YEAR = Y.YEAR

這是 dbfiddle,因此您可以可視化 - https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=9e777ad925b09eb8ba299d610a78b999

Vertica SQL 不是可用的測試環境,因此這可能無法直接工作,但至少應該讓您走上正軌。

由於某些原因,LAG function 無法獲得 2019

  • 它是 window function 並且只能從可用數據中獲取 - 在您的情況下,LAG 的默認值似乎是 1 aka LAG(YEAR_COUNT, 1)
  • select 中的語句通常無法將任何行數據添加回表中,您需要使用 JOIN 添加數據

如果 2019 確實存在於先前的表中,並且您使用 group by 來獲取年份計數,則您可能有一個排除數據的 where 子句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM