簡體   English   中英

如何獲得特定月份但動態年份的 Trailing 12 Months?

[英]How do I get Trailing 12 Months for a specific month but dynamic year?

我以一月為例來嘗試簡化這一點。

這是原始查詢:

SELECT 
  ASIN
, SUM(CASE WHEN search_date BETWEEN DATEADD(month, -12, '2022-01-31')  AND '2022-01-31' THEN all_searches ELSE 0 END) jan_ttm_searches
FROM search_table 
WHERE search_date BETWEEN DATEADD(month, -12, '2022-01-31')  AND '2022-01-31'
GROUP BY 1;

我想要做的是采用此查詢並將其修改為基於當前年份而不是靜態日期運行。 所以,例如:

  • 現在(2022 年 12 月)運行這個應該給我 2022 年 1 月的 TTM
  • 在 2023 年 1 月運行它應該會給我 2022 年 1 月的 TTM(因為這個月不完整)
  • 在 2023 年 2 月運行它應該會給我 2023 年 1 月的 TTM(因為 1 月現在已經過去了,我們有完整的數據)

我需要“2022-01-31”來適應當前日期而不是靜態的。

ASIN 是數字/字符標識符。 搜索日期示例為 2022-11-24 00:00:00。 All_searches 是那個日期的搜索次數。

我試圖在 CASE WHEN 中添加一個 EXTRACT,但是嵌套聚合出錯了。

CASE WHEN search_date between dateadd(month, -12, TRUNC(MAX(search_date)))) AND TRUNC(MAX(search_date)) 
            AND EXTRACT(MONTH FROM search_date) = 1 AND EXTRACT(YEAR FROM search_date) = EXTRACT(YEAR FROM CURRENT_DATE)

我嘗試使用 RUN_DATE,它讓我從當前日期開始獲取 TTM,但不是從一月份開始。

case when search_date BETWEEN ADD_MONTHS(TO_DATE('{RUN_DATE_YYYYMMDD}', 'YYYYMMDD'), -12) AND TO_DATE('{RUN_DATE_YYYYMMDD}', 'YYYYMMDD') then all_searches else 0 end

我嘗試用谷歌搜索類似的問題,但找不到適合我正在嘗試做的事情的解決方案。

查詢將轉到 Redshift。 任何幫助表示贊賞。 謝謝你。

編輯添加:所需的輸出是一列 ASIN 和一列該月的搜索總數。 除靜態日期外,原始查詢有效。 這旨在每月按計划運行,並且需要對當前的年份/月份做出反應。

我想你已經回答了你自己的問題。 您不能嵌套聚合,但可以在子查詢中計算 MAX()。 您可以通過以下幾種方式執行此操作:

  1. 計算 CTE 或子查詢中的最大值,並將此結果用於 CASE 語句。 您可以使用 MAX() 窗口函數執行此操作,以便為 CASE 語句顯示所有原始行。
  2. 計算 MAX() 並將此單個值交叉連接到原始表。

#1 對於大表可能更好,因為它只需要掃描表一次,而 #2 掃描表兩次。

================================================ ========

由於您沒有提供任何數據或預期結果,我已經編寫了一些數據和一個過程來實現您正在尋找的東西。 這可能不准確,但會顯示如何從源表中生成您要查找的日期限制。

我還進行了更改,以便 SQL 將在 Postgres 和 Redshift 中運行,因此您可以根據需要使用 sql fiddle 來處理代碼。

設置數據:

create table test (
  ASIN varchar(16),
  search_date date,
  all_searches int
);

insert into test values
  ('abc', '2021-01-15', 5),
  ('def', '2021-02-15', 4),
  ('ghi', '2021-03-15', 3),
  ('jkl', '2021-04-15', 2),
  ('mno', '2021-05-15', 1),
  ('abc', '2021-06-15', 10),
  ('def', '2021-07-15', 11),
  ('ghi', '2021-08-15', 12),
  ('jkl', '2021-09-15', 13),
  ('mno', '2021-10-15', 14),
  ('abc', '2022-01-15', 9),
  ('def', '2022-01-15', 8),
  ('ghi', '2022-01-15', 7),
  ('jkl', '2022-01-15', 6),
  ('mno', '2022-01-15', 5)
  ;

詢問:

WITH max_date AS (
  SELECT *, 
      DATE_TRUNC('month', MAX(search_date) OVER ()) 
          + interval '1 month' - interval '1 day' as max_date
  FROM test
)
SELECT 
  ASIN
, SUM(
      CASE WHEN search_date BETWEEN max_date - interval '12 months' 
          AND max_date
      THEN all_searches 
      ELSE 0 END) jan_ttm_searches
FROM max_date
WHERE search_date BETWEEN '2022-01-31'::date - interval '12 months' 
    AND '2022-01-31'::date
GROUP BY 1
ORDER by 1;

如果你喜歡,可以玩 SQL Fiddle:

http://sqlfiddle.com/#!15/3e0e2/13

就像我說的,這不太可能是您正在尋找的確切結果,但應該可以幫助您入門。

暫無
暫無

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

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