簡體   English   中英

當年、月、日存儲在不同的列中時如何獲取不同的值

[英]How to get distinct values when year, month, day of date are stored in different columns

我正在使用 AWS Athena 查詢過去 7 天列的不同值的計數。

該查詢由 lambda function 調用,該查詢在每月的每個星期日調用,並從上星期日到本星期六提取數據。

因此,例如,如果今天是 2022 年 9 月 11 日,星期日,那么 lambda 將嘗試從 22 年 9 月 4 日,星期日到 22 年 9 月 10 日,星期六,查詢表,查詢看起來像這樣。

SELECT
    col1,
    col2,
    COUNT(DISTINCT col3) AS distinctValues
FROM "dbName"."tbl"
WHERE year = '2022'
    AND month = '09'
    AND day IN ('04','05','06','07','08','09','10' )
GROUP BY 
    col1,
    col2;

年、月和日是不同的列,因此我們有日列的IN子句。

現在的問題是,如果查詢必須在 2022 年 9 月 4 日運行,則必須考慮兩個月。 必須運行查詢以獲取從 22 年 8 月 28 日星期日到 22 年 9 月 3 日星期六的數據。

我無法運行此查詢來獲取數據,因為它不包含不同值的正確計數。

SELECT
    col1,
    col2,
    COUNT(DISTINCT col3) AS distinctValues
FROM "dbName"."tbl"
WHERE year = '2022'
    AND month IN ('08','09')
    AND day IN ('28','29','30','31','01','02','03' )
GROUP BY 
    col1,
    col2;

而且我也無法處理來自 8 月和 9 月的兩個單獨查詢的結果,因為不同的值將不正確。

在這里可以做些什么來獲得分布在兩個月之間的日期范圍的不同值,並考慮到年、月和日存儲在不同列中的表模式?

因此,您應該比較月份和日期,並且對於其他月份,必須單獨重復該條件:

SELECT
    col1,
    col2,
    COUNT(DISTINCT col3) AS distinctValues
FROM "dbName"."tbl"
WHERE year = '2022'
    AND (month = '08' AND day IN ('X', 'Y' /*prefered days*/)
        OR  (month = '09' AND day IN ('A', 'B')))
GROUP BY 
    col1,
    col2;

最好將 StartDate 和 EndDate 作為日期字段傳遞,並將表的年、月和日列組合在一起,使用 date_parse 形成計算的 DATE,然后比較范圍。

SELECT
    col1,
    col2,
    COUNT(DISTINCT col3) AS distinctValues
FROM "dbName"."tbl"
WHERE 
    date_parse(cast(year * 10000 + month * 100 + day as varchar(255)), '%Y%m%d') BETWEEN @StartDate and @EndDate
GROUP BY 
    col1,
    col2;

請使用 AWS Athena 中的 date_parse 方法從年、月和日期中獲取日期。 請參閱從 athena aws 中單獨字段中的整數創建日期

我建議將數據轉換為日期並將其作為一個處理(例如使用date_diffbetween )。 可能最短的(就代碼而言)方法是使用array_join (如果每個部分的格式都正確)。 沿着這條線的東西:

SELECT col1,
       col2,
       COUNT(DISTINCT col3) AS distinctValues
FROM "dbName"."tbl"
WHERE date_diff('day', date(array_join(array[year, month, date], '-')), now())
    between 1 and 7
GROUP BY col1,
         col2;

盡管如果這些字段用於分區數據,您可能需要使用另一種方法 go 以獲得更好的性能。

暫無
暫無

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

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