Функция COUNT CASE для диапазона дат - PullRequest
0 голосов
/ 14 апреля 2019

Я пытаюсь найти элегантное решение для двух проблем: У меня проблема с разделом SELECT по обоим вопросам. Другая часть запросов в порядке

Вопросы теоретически, поэтому нет базы данных для их выполнения.

Q1 : вытащить следующий отчет: для каждого дня показывать накопленный (перемещение) количество «лайков» за последние 5 дней включительно (например: 5 мая покажет общее количество лайков с 1 по 5 мая). География за пределами США.

Колонны :

DataTimstamp - верхняя граница 5-дневного периода времени. Всего - количество лайков за промежуток времени Region_US - количество лайков в стране = 'US' Region_rest - количество лайков в стране <> '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;

Ответы [ 2 ]

0 голосов
/ 14 апреля 2019

В течение 1-го квартала за последние 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
 ;
0 голосов
/ 14 апреля 2019

Для Q2, я думаю, вы можете использовать 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...