Группировать по дате час в sql

#mysql #sql #select #group-by #count

#mysql #sql #выберите #группировать по #количество

Вопрос:

halo, я хочу добавить id затем group by product и date hour(без изменения datetime на varchar). с данными:

 datetime               product    sold
2020-10-27 08:51:00       A        50
2020-10-27 08:52:00       A        10
2020-10-27 08:52:00       B        20
2020-10-27 09:52:00       B        30
 

мой запрос:

 select newId() as id, datehour(datetime) datehour, product, sum(sold)
from table_a
group by datehour(datetime), product
 

но не сработало

мой ожидаемый результат:

примечание: дата час должен иметь тип datetime, а не varchar

 id   datehour               product    sold
1    2020-10-27 08:00:00       A        60
2    2020-10-27 08:00:00       B        20
3    2020-10-27 09:00:00       B        30
 

примечание: дата час должен иметь тип datetime, а не varchar

есть идеи?

Комментарии:

1. datehour Вы что-то написали? Является ли степень «не сработал» типом datehour или есть что-то еще неправильное.

2. Что такое newId() ?

3. Какую версию MySQL вы используете?

4. @Nick я использую mysql workbench, newId — это номер строки (он должен быть последовательным)

5. Не workbench, это MySQL 8.0 или 5.x?

Ответ №1:

Непонятно, чего вы пытаетесь достичь newId() . Кроме этого, вы можете получить желаемый результат, используя DATE_FORMAT и STR_TO_DATE , чтобы отделить минуты и секунды от времени, чтобы получить datehour значение; затем вы можете GROUP BY использовать и product и SUM sold значения:

 SELECT STR_TO_DATE(DATE_FORMAT(`datetime`, '%Y-%m-%d %H'), '%Y-%m-%d %H') AS datehour,
       product,
       SUM(sold) AS sold
FROM table_a
GROUP BY datehour, product
 

Вывод:

 datehour                sold    product
2020-10-27 08:00:00     60      A
2020-10-27 08:00:00     20      B
2020-10-27 09:00:00     30      B
 

Демонстрация на db-fiddle

С точки зрения генерации id значения, если вы используете MySQL 8 , вы можете использовать ROW_NUMBER() :

 SELECT ROW_NUMBER() OVER (ORDER BY datehour, product) AS id,
       datehour,
       product,
       sold
FROM (
  SELECT STR_TO_DATE(DATE_FORMAT(`datetime`, '%Y-%m-%d %H'), '%Y-%m-%d %H') AS datehour,
         product,
         SUM(sold) AS sold
  FROM table_a
  GROUP BY datehour, product
) a
ORDER BY id
 

Для MySQL 5.x вы можете имитировать ROW_NUMBER() с помощью переменной:

 SELECT @rn := @rn   1 AS id,
       datehour,
       product,
       sold
FROM (
  SELECT STR_TO_DATE(DATE_FORMAT(`datetime`, '%Y-%m-%d %H'), '%Y-%m-%d %H') AS datehour,
         product,
         SUM(sold) AS sold
  FROM table_a
  GROUP BY datehour, product
  ORDER BY datehour, product
) a
CROSS JOIN (SELECT @rn := 0) i
 

В обоих случаях вывод:

 id  datehour                product     sold
1   2020-10-27 08:00:00     A           60
2   2020-10-27 08:00:00     B           20
3   2020-10-27 09:00:00     B           30
 

Демонстрация на db-fiddle

Комментарии:

1. его работа для меня, является ли столбец datehour типом datetime? @Nick

2. @hinafaya да, это так

3. @hinafaya Я добавил еще два запроса (один для MySQL 8 , один для MySQL 5.x), которые будут генерировать id нужное вам значение.

4. спасибо @Nick, запрос для mysql 8 работает для меня, superbbb