Дневная разница отсчетов за предыдущие 24 часа - PullRequest
2 голосов
/ 24 апреля 2020

У меня есть таблица для консолидации статистики для различных типов из других моих таблиц:

Имя таблицы: my_stats

lob         category            parameter                   total_count     timestamp                       day_difference
DSS         Industry            Advertising & Marketing     310057          2020-04-21 07:35:14.237987
DSS         Function            Administration              357351          2020-04-21 11:06:27.009658
DSS         Country             czechia                     321             2020-04-21 11:12:55.731648
DSS         Records per domain  apple.com                   65              2020-04-21 11:13:17.855059
DSS         Records per domain  Records per domain          5               2020-04-21 11:13:17.85510

DSS         Industry            Advertising & Marketing     310059          2020-04-21 10:36:14.237987
DSS         Function            Administration              357353          2020-04-21 14:08:26.009658
DSS         Country             czechia                     324             2020-04-21 14:11:55.731648
DSS         Records per domain  apple.com                   60              2020-04-21 14:08:17.855059
DSS         Records per domain  Records per domain          5               2020-04-21 14:14:17.85510

DSS         Industry            Advertising & Marketing     310058          2020-04-22 08:35:14.237987
DSS         Function            Administration              357312          2020-04-22 11:05:27.009658
DSS         Country             czechia                     201             2020-04-22 11:13:55.731648
DSS         Records per domain  apple.com                   55              2020-04-22 11:14:17.855059
DSS         Records per domain  Records per domain          2               2020-04-22 11:15:17.85510

my_stats обновляется каждые 3 часа. Итак, новые записи добавляются каждые 3 часа. Я должен найти значение day_difference.

Значение day_difference равно (count - счетчик следующей строки, ближайшей к 24 часам ранее).

Выходные данные таблицы должны быть:

lob         category            parameter                   total_count     timestamp                       day_difference
DSS         Industry            Advertising & Marketing     310057          2020-04-21 07:35:14.237987      NULL
DSS         Function            Administration              357351          2020-04-21 11:06:27.009658      NULL
DSS         Country             czechia                     321             2020-04-21 11:12:55.731648      NULL
DSS         Records per domain  apple.com                   65              2020-04-21 11:13:17.855059      NULL
DSS         Records per domain  Records per domain          5               2020-04-21 11:13:17.85510       NULL

DSS         Industry            Advertising & Marketing     310059          2020-04-21 10:36:14.237987      NULL
DSS         Function            Administration              357353          2020-04-21 14:08:26.009658      NULL
DSS         Country             czechia                     324             2020-04-21 14:11:55.731648      NULL
DSS         Records per domain  apple.com                   60              2020-04-21 14:08:17.855059      NULL
DSS         Records per domain  Records per domain          5               2020-04-21 14:14:17.85510       NULL

DSS         Industry            Advertising & Marketing     310058          2020-04-22 08:35:14.237987      1
DSS         Function            Administration              357312          2020-04-22 11:05:27.009658      NULL
DSS         Country             czechia                     201             2020-04-22 11:13:55.731648      -120
DSS         Records per domain  apple.com                   55              2020-04-22 11:14:17.855059      -10
DSS         Records per domain  Records per domain          2               2020-04-22 11:15:17.85510       -3

Если для строка, следующая до 24 часов, недоступна, затем оставьте day_difference = NULL.

Еще один важный случай, который следует рассмотреть, - это разница между CLOSEST до 24 часов.

Есть ли способ получить этот результат в SQL?

Ответы [ 2 ]

3 голосов
/ 26 апреля 2020

Это было бы хорошее место для использования оконной функции, такой как lag() со спецификацией range . Увы, Redshift поддерживает только rows в предложении frame для оконных функций.

Вот альтернатива, которая использует коррелированный подзапрос:

select
    s.*,
    total_count - (
        select total_count
        from my_stats s1
        where 
            s1.lob = s.lob
            and s1.category = s.category
            and s1.parameter = s.parameter
            and s1.timestamp < s.timestamp - interval '1 day'
        order by s1.timestamp desc
        limit 1
    ) day_diff
from my_stats s

Для производительности вам нужен индекс на (lob, category, parameter, timestamp, total_count).

1 голос
/ 03 мая 2020

Вы можете использовать RANK для идентификации первой записи за 24-часовой период, а затем просто вычитания. Я предполагаю, что вы используете Amazon RedShift SQL здесь. Если нет, синтаксис NVL заменяется на ISNULL в MS SQL.

https://docs.aws.amazon.com/redshift/latest/dg/r_WF_RANK.html

SELECT
  r.lob
 ,r.category
 ,r.parameter
 ,r.total_count
 ,r.timestamp
 ,i.day_difference
FROM dbo.my_stats r
LEFT JOIN (

  SELECT
    x.lob
   ,x.category
   ,x.parameter
   ,x.total_count
   ,x.timestamp
   ,RANK() OVER (PARTITION BY p.lob,p.category,p.parameter ORDER BY p.timestamp) AS rank_order
   ,x.total_count - p.total_count AS day_difference
  FROM dbo.my_stats x
  INNER JOIN dbo.my_stats p  --> lookback period
    ON p.lob       = x.lob
   AND p.category  = x.category
   AND p.parameter = x.parameter
   AND p.timestamp < x.timestamp
   AND p.timestamp > DATEADD(HOUR,-24,x.timestamp)

) i
 ON i.lob       = r.lob
AND i.category  = r.category
AND i.parameter = r.parameter
AND i.timestamp = r.timestamp
WHERE NVL(i.rank_order,1)=1
...