Как вы можете получить диапазон дат, основанный на том, что другое значение перестает быть таким же последовательно? - PullRequest
0 голосов
/ 26 сентября 2019

Вот пример моих данных:

VendingID  Date        SnackType   User     TotalBought
 9          2014-11-30  chocolate   ben      10
 9          2015-11-30  chocolate   frank    12
 9          2016-11-30  chocolate   ben      9
 9          2014-11-30  crisps      ben      10
 9          2015-11-30  crisps      frank    12
 9          2016-11-30  crisps      ben      9
 10         2014-11-30  chocolate   ben      10
 10         2015-11-30  chocolate   frank    12
 10         2016-11-30  chocolate   ben      9
 10         2017-11-30  chocolate   frank    7
 10         2018-11-30  chocolate   frank    7
 10         2019-11-30  chocolate   frank    6
 10         2014-11-30  crisps      frank    9
 10         2015-11-30  crisps      frank    7
 10         2016-11-30  crisps      ben      9
 10         2017-11-30  crisps      frank    7
 10         2018-11-30  crisps      ben      3
 10         2019-11-30  crisps      ben      2

Можно ли суммировать общее количество купленных закусок по типу для данного VendingID для пользователя, который является самым последним,возвращаться только в течение нескольких лет подряд, пока пользователь не изменится?

Таким образом, ожидаемый результат для VendingID 10 будет таким: для шоколада пользователь будет «откровенным», что составит 2019, 2018 и 2017 только в том случае, если естьизменение в пользователе, которое вернуло бы значение 6 + 7 + 7 = 20. В том же запросе я также хотел бы вернуть то же самое для чипсов, так что пользователь будет 'бен', суммируя только 2019 и 2018, чтобудет 2 + 3 = 5. Таким образом, возвращаемый результат будет:

SnackType SumTotalBought chocolate 20 crisps 5

Так что я думаю, что я могу получить SnackType и USer по VendingID для текущей (самой последней) даты, но не знаю, как получить диапазон, который относится к последовательным годам, поэтому я могу суммировать TotalBought:

SELECT SnackType, User
FROM vendingOptions vo
JOIN (SELECT MAX(Date) as maxDate
      FROM vendingOptions vo2
      WHERE VendingID = '10') as md
ON md.maxDate = vo.Date
WHERE VendingID = '10'

1 Ответ

0 голосов
/ 26 сентября 2019

Хммм.,,Я не уверен, действительно ли важны "последовательные годы" или только последний запуск для одного и того же пользователя.Позвольте мне предположить, что это последнее:

select vendingid, snacktype, sum(totalbought)
from (select vo.*,
             max(case when user <> last_user then date end) over (partition by vendingid) as last_nonuserdate
      from (select vo.*,
                   first_value(vo.user) over (partition by vendingid order by date desc) as last_user
            from vendingoptions vo
           ) vo
     ) vo
where date > last_nonuserdate or last_nonuserdate is null
group by vendingid, snacktype
order by vendingid, snacktype;

Самый внутренний подзапрос находит последнего пользователя для каждого поставщика.Затем средний подзапрос находит самую последнюю дату для других пользователей.Фильтры и агрегаты внешних запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...