簡體   English   中英

如何 select 僅在給定的所有日期范圍內存在的那些記錄

[英]How to select only those records which are present in given all DATE range

我想 select 只有所有日期都存在重復數據計數的數據。

示例我的表數據是:

用戶身份 row_created
8SRWS3hMR 2020-12-14 00:13:31
8SRWS3hMR 2020-12-14 00:35:06
8SRWS3hMR 2020-12-14 12:11:37
8SRWS3hMR 2020-12-14 13:16:27
8SRWS3hMR 2020-12-14 16:30:00
8SRWS3hMR 2020-12-14 19:25:11
8SRWS3hMR 2020-12-14 19:27:07
8SRWS3hMR 2020-12-15 17:14:06
8SRWS3hMR 2020-12-16 14:53:54

如果我 select 的日期范圍在2020-12-142020-12-17之間,那么 output 應該是 Z37A6259CC0C1DAE299A7866489DFF0BD。

如果我 select 日期范圍在2020-12-142020-12-16之間,那么 output 應該低於

用戶身份 全部的 row_created
8SRWS3hMR 7 2020-12-14 00:13:31
8SRWS3hMR 1 2020-12-15 17:14:06
8SRWS3hMR 1 2020-12-16 14:53:54

我試過下面的查詢

select user_id, count(user_id) as total, row_created from reward
where user_id = '8SRWS3hMR' AND DATE(row_created) BETWEEN '2020-12-14' AND '2020-12-17'
group by DATE(row_created);

但根據我的要求, output 應該是 null 因為在BETWEEN日期范圍內我已經通過'2020-12-17'

請忽略語法錯誤。

您可以按如下方式使用HAVING子句:

SELECT USER_ID,
       COUNT(USER_ID) AS TOTAL,
       ROW_CREATED
  FROM REWARD
 WHERE USER_ID = '8SRWS3hMR'
   AND DATE(ROW_CREATED) BETWEEN '2020-12-14' AND '2020-12-17'
 GROUP BY DATE(ROW_CREATED) 
 HAVING COUNT(DISTINCT DATE(ROW_CREATED)) = datediff('2020-12-17', '2020-12-14') + 1;

- 更新

SELECT * FROM
(SELECT USER_ID,
       COUNT(USER_ID) AS TOTAL,
       ROW_CREATED,
       COUNT(DISTINCT DATE(ROW_CREATED)) OVER (PARTITION BY USER_ID) AS CNT
  FROM REWARD
 WHERE USER_ID = '8SRWS3hMR'
   AND DATE(ROW_CREATED) BETWEEN '2020-12-14' AND '2020-12-17'
 GROUP BY USER_ID, DATE(ROW_CREATED) 
) T WHERE CNT = datediff('2020-12-17', '2020-12-14') + 1

這有點復雜,因為您需要按日期匯總。 您可以使用 window 函數:

SELECT r.*
FROM (SELECT USER_ID, DATE(ROW_CREATED) as date, COUNT(*) AS TOTAL,
             MIN(ROW_CREATED) as ROW_CREATED,
             COUNT(*) OVER (PARTITION BY USER_ID) as num_days,
             DATEDIFF(x.end_date, x.start_date) + 1 AS total_days
      FROM REWARD R CROSS JOIN
           (SELECT DATE('2020-12-14') as START_DATE, DATE('2020-12-17') as END_DATE
           ) params
      WHERE USER_ID = '8SRWS3hMR' AND
            ROW_CREATED >= x.start_date AND
            ROW_CREATE <= x.end_date + interval 1 day
      GROUP BY DATE(ROW_CREATED) 
     ) R
WHERE num_days = total_days;

子查詢按天匯總。 它包括兩個方面:

  • USER_ID的不同天數。
  • 總天數。

為了避免多次輸入相同的日期,這些日期在子查詢中定義。 另請注意,日期比較已重新安排。 不使用DATE() function,而是使用不等式。 這使得表達式與索引更兼容。

select user_id, count(user_id) as total, row_created from reward where user_id = '8SRWS3hMR' AND DATE(row_created) >= '2020-12-14' AND DATE(row_created) <= '2020-12-17' group by DATE (row_created) 有 count(user_id) >= DATEDIFF(row_created, '2020-12-17')

暫無
暫無

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

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