ВЫБЕРИТЕ ГРУППУ с несколькими условиями - PullRequest
0 голосов
/ 02 февраля 2020

У меня есть эта таблица ниже, и я хочу получить минимальное значение количества, максимальное значение количества, первое значение количества и последнее значение количества. Новая таблица должна быть сгруппирована по дате с интервалом в 1 день.

id  item    quantity    date
1   xLvCm   2           2020-01-10 19:15:03
1   UBizL   4           2020-01-10 20:16:41
1   xLvCm   1           2020-01-10 21:21:12
1   xLvCm   3           2020-01-11 11:14:00
1   UBizL   1           2020-01-11 15:01:10
1   moJEe   4           2020-01-12 00:15:50
1   moJEe   1           2020-01-12 02:11:23
1   UBizL   1           2020-01-12 04:16:17
1   KiZoX   3           2020-01-13 10:10:02
1   KiZoX   2           2020-01-13 19:05:40
1   KiZoX   1           2020-01-13 20:14:33

Это ожидаемый результат таблицы

min(quantity)   max(quantity)   first(quantity) last(quantity)    date
1               4               2               1                 2020-01-10 19:15:03
1               3               3               1                 2020-01-11 11:14:00
1               4               4               1                 2020-01-12 00:15:50
1               4               3               1                 2020-01-13 10:10:02

Я попытался запрос SQL
SELECT MIN(quantity), MAX(quantity), FIRST(quantity), LAST(quantity) FROM tablename GROUP BY date
Я не могу понять, как включить первое и последнее значения количества и группы по дням (например, 10, 11, 12, 13) вместо даты, например (2020-01-10 19:15: 03)

Ответы [ 3 ]

0 голосов
/ 02 февраля 2020

Общий подход к этой проблеме - использовать оконные функции и агрегирование. Вот один из методов:

SELECT date(date), MIN(quantity), MAX(quantity),
       MAX(CASE WHEN seqnum_a = 1 THEN quantity END) as first_quantity,
       MAX(CASE WHEN seqnum_d = 1 THEN quantity END) as last_quantity
FROM (SELECT t.*,
             ROW_NUMBER() OVER (PARTITION BY date(date) ORDER BY date) as seqnum_a,
             ROW_NUMBER() OVER (PARTITION BY date(date) ORDER BY date des) as seqnum_d
      FROM tablename t
     ) t
GROUP BY date(date);
0 голосов
/ 02 февраля 2020

Попробуйте:

select A.minquantity,A.maxquantity,B.firstquantity,C.lastquantity,A.date from (
    (select min(quantity) as minquantity,max(quantity) as maxquantity,Date(date) as date 
    from Test group by Date(date))A
    join 
    (select Date(date) as date,quantity as firstquantity from 
    Test where date in (select min(date) from Test group by Date(date)))B
    on A.date=B.date
    join 
    (select Date(date)as date,quantity as lastquantity from Test 
    where date in (select max(date) from Test group by Date(date)))C
    on A.date=C.date
    );

Вывод:

1   4   2   1   2020-01-10
1   3   3   1   2020-01-11
1   4   4   1   2020-01-12
1   3   3   1   2020-01-13
0 голосов
/ 02 февраля 2020

Важно указать инструмент базы данных, который вы используете, поскольку в каждом из них доступны различные функции. Но если бы вы использовали Snowflake, я бы попробовал это:

select distinct day(date) as day_of_month,
       min(quantity) over (partition by day(date) order by date range between unbounded preceding and UNBOUNDED FOLLOWING) min_quantity, 
       max(quantity) over (partition by day(date) order by date range between unbounded preceding and UNBOUNDED FOLLOWING) max_quantity ,
       last_value(QUANTITY) over (partition by day(date) order by date range BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) as last_quantity,  
       first_value(QUANTITY) over (partition by day(date) order by date range BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) as first_quantity
from demo_db.staging.test

Важно отметить, что это дорогостоящий запрос. Если ваш стол огромный, это может занять слишком много времени.

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