Есть ли способ применить цикл в предварительном запросе - PullRequest
0 голосов
/ 09 ноября 2019

Мой вариант использования заключается в том, чтобы использовать приведенное ниже представление preto в верхней части таблицы, чтобы получить дневной счет путем вычитания текущего значения из значения вчерашнего дня. Если в таблице нет данных, то представление должно динамически учитывать значение следующего дня, а затем взять среднее значение для представления отсутствующего дня.

Это предварительный запрос. Я взял только одно поле в приведенном ниже запросе

CREATE OR REPLACE VIEW hive.facebook.post_metrics_daily AS
SELECT
    a.post_id,
    a.page,
    a.dt,
    a.created_time,
    (
        COALESCE(
            (
                CAST(a.likes AS integer) 
                - IF(
                    (CAST(b.likes AS integer) IS NULL), 
                    0, 
                    CAST(b.likes AS integer)
                )
            )
            , 0
        )
    ) likes
FROM
    hive.facebook.post_metrics a                 
    LEFT JOIN hive.facebook.post_metrics b 
        ON  a.dt = (b.dt + INTERVAL  '+1' DAY)
        AND a.post_id = b.post_id 
        AND a.brandname = b.brandname
WHERE a.dt = date'2019-09-10'

Если данные за 9-12-й и 10-е данные отсутствуют, то представление должно принимать данные за 11-й день и принимать средние значения за 9-й и 11-й, чтобы дать10-й вид. Как это можно сделать? Можно ли применить эту формулу в запросе, и если да, то каким образом?

(today-yesterday)/n+1, где n будет числом пропущенных дней.

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

 Date   Likes-org.  missing likes daily likes org.   expected likes
2019-10-17  20487   20487         20487                  20487
2019-10-18  25384   25384          4897                  4897
2019-10-19  26817   26817          1433                  1433
2019-10-20  27499   missing likes   682                   257
2019-10-21  27854   missing likes   355                   258
2019-10-22  27987   missing likes   133                   258
2019-10-23  28065   missing likes   78                    258
2019-10-24  28106   28106           41                    258
2019-10-25  28134   28134           28                     28

1 Ответ

0 голосов
/ 09 ноября 2019

Я думаю, вы просто хотите lag():

SELECT pm.*,
       (pm.likes +
        LAG(pm.likes) OVER (PARTITION BY pm.post_id, pm.brand_name ORDER BY pm.dt)
       ) / 2
FROM hive.facebook.post_metrics pm ;

Если вы хотите рассматривать пропущенные дни как 0 с, вам нужна арифметика дат. Я думаю, что это будет:

SELECT pm.*,
       ( (pm.likes +
          LAG(pm.likes) OVER (PARTITION BY pm.post_id, pm.brand_name ORDER BY pm.dt)
         ) /
         DATE_DIFF(day,
                   LAG(pm.dt) OVER (PARTITION BY pm.post_id, pm.brand_name ORDER BY pm.dt),
                   dt
                  )
       )
FROM hive.facebook.post_metrics pm ;

Если вы хотите это для определенного дня, используйте подзапрос или для вышеприведенного выражения, а затем отфильтруйте во внешнем запросе.

...