日期范围内的 COUNT CASE 函数

Posted

技术标签:

【中文标题】日期范围内的 COUNT CASE 函数【英文标题】:COUNT CASE function on a range of dates 【发布时间】:2019-04-14 14:58:12 【问题描述】:

我试图为两个问题找到一个优雅的解决方案: 我对这两个问题的 SELECT 部分都有疑问。 查询的其他部分很好

从理论上讲,这些问题没有可用于运行它的数据库。

Q1:拉取以下报表:每天显示累计 (移动)过去 5 天(包括在内)的“喜欢”数(例如:5 月 5 日) 将显示从 5 月 1 日到 5 月 5 日的总点赞数。)分为美国与美国。 非美国地区。

DataTimstamp - 5 天时间范围的上限 Total - 数量 在时间范围内点赞 Region_US - 国家/地区的点赞数 = 'US' Region_rest - country'US'

的点赞数

Q2:每天拉取创建的用户数量和每日变化 与前一天相比。

代码

SELECT 
       DATEADD(day, 4, se.date) AS DataTimstamp,
       COUNT(se.type_id) AS Total,
       COUNT(CASE WHEN lo.country_3_character_code = 'USA' THEN 1 ELSE NULL END) AS 'Region_USA',
       COUNT(CASE WHEN lo.country_3_character_code != 'USA' THEN 1 ELSE NULL END) AS 'Region_rest'
  FROM  system_events se
  JOIN  location lo ON se.location_id = lo.id
  WHERE se.type = 'like'
GROUP BY 1

SELECT u.creation_date AS 'day', 
      COUNT(IF(day = u.creation_date, u.id, 0)) AS Date_day,
      COUNT(IF(day = u.creation_date - interval 1 day , u.id, 0)) AS Date_before,
      SUM(SUM(Date_day)-SUM(Date_before)) AS daily_change 
FROM user u
GROUP BY 1;

【问题讨论】:

【参考方案1】:

对于第二季度,我认为您可以使用 LAG 来获取前一天,例如这个简单的例子:

with cte_table as
(
select * from
(values
   ('01-Jan-19',1)
  ,('02-Jan-19',2)
  ,('03-Jan-19',3)
  ,('04-Jan-19',4)
  ,('05-Jan-19',5)
) as t (TheDate,TheValue))

select TheDate, TheValue,
       LAG(TheValue,1,0) OVER(ORDER BY TheDate) as Prev_Value 
from cte_table;

【讨论】:

【参考方案2】:

在过去 5 天的第一季度,我对此进行了一次赌注,我可能会被 SQL Masters 活生生吃掉:-o,可能与交叉应用有关,但超出了我目前的知识范围。

with cte_table as
(
  select * from
    (values
     ('01-Jan-19',10)
    ,('02-Jan-19',20)
    ,('03-Jan-19',10)
    ,('04-Jan-19',5)
    ,('05-Jan-19',10)
    ,('06-Jan-19',20)
    ,('07-Jan-19',10)
    ,('08-Jan-19',10)
    ,('09-Jan-19',10)
    ,('10-Jan-19',5)
) as t (TheDate,TheValue))
, cte_table2 as
(
  select TheDate, TheValue
     ,LAG(TheValue,1,0) OVER(ORDER BY TheDate) as Prev_Value1 
     ,LAG(TheValue,2,0) OVER(ORDER BY TheDate) as Prev_Value2 
     ,LAG(TheValue,3,0) OVER(ORDER BY TheDate) as Prev_Value3 
     ,LAG(TheValue,4,0) OVER(ORDER BY TheDate) as Prev_Value4 
  from cte_table
)

 select TheDate
        ,sum(TheValue) as current_day
        , sum(TheValue) + sum(Prev_Value1) + sum(Prev_Value2) + sum(Prev_Value3) + sum(Prev_Value4) as [last 5 days]
 from cte_table2
 group by TheDate
 order by TheDate
 ;

【讨论】:

以上是关于日期范围内的 COUNT CASE 函数的主要内容,如果未能解决你的问题,请参考以下文章

C# 获取一个指定范围内的随机日期函数代码

选择日期范围内的分组值总和(窗口函数)

spark sql怎么去获取hive 表一定日期范围内的数据

大日期范围内的最小/最大日期值取决于值

使用php计算日期范围内的天数?

SQL:如何显示给定范围内的所有日期?