![](/img/trans.png)
[英]Count if date in date column is between start and end date [ Oracle SQL ]
[英]Teradata SQL code to find count between eff start and end date
我有一個包含 5 列的數據集。 每個帳戶可以有多個行。 我需要按 C2 和月年對數據進行分組並查找計數
ACC_ID, C1 , C2, EFF_START_DATE, EFF_END_DATE
111 , 0 , A , 2018-01-01, 2499-12-31
222 , 0 , A , 2018-02-15 , 2018-03-15
222 , 0 , B , 2018-03-16, 2499-12-31
333 , 0, A, 2000-01-01, 2499-12-31
我需要按月分組並找到每個月的計數。 因此,如果有人將 2018-01-01 作為 EFF_STA_DTE,並將 2499-12-31 作為 EFF_END_DATE。 它們應該成為 2018 年開始的所有月份的一部分。
同樣,如果有人將 2018-02-15 作為 EFF_STA_DTE,並將 2018-03-15 作為 EFF_END_DATE,則他們的計數應該只反映 2018 年 2 月和 2018 年 3 月。
此外,即使 eff_start_Date 已經過去,我也只是想從 2018 年開始計算。 因此,上述情況下的 333 將在 2018 年及以后計數為 1
試圖提取月年並根據 eff_start_Date 進行計數,但結果不正確。
在上述情況下預期為 Output
MONTH, C2, COUNT
JAN-18, A, 2. -- FOR ACCOUNT 111 ,333
FEB-18, A , 3. -- FOR ACCOUNT 111,222,333
MARCH-18, A, 1 -- FOR ACCOUNT 111,222,333
MARCH-18, B, 1. -- FOR ACCOUNT 222
最有效的方法是利用 Teradata 對標准 SQL 的EXPAND ON
擴展:
WITH cte AS
(
SELECT -- first of month
Trunc(BEGIN(pd), 'mon') AS mon
,C2
FROM tab
-- create a period on-the-fly, adjust the end date as periods exclude the end
EXPAND ON PERIOD(EFF_START_DATE, Next(EFF_END_DATE)) AS pd
-- return one row per month
BY ANCHOR PERIOD MONTH_BEGIN
-- restrict output to a specifc range
FOR PERIOD (date '2018-01-01', date '2018-03-31')
)
SELECT mon, C2, Count(*)
FROM cte
GROUP BY 1,2
ORDER BY 1,2
;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.