【问题标题】:Group by date hour in sql在sql中按日期小时分组
【发布时间】:2021-03-09 20:58:33
【问题描述】:

晕,我想添加 id 然后 group by 产品和日期时间(不将日期时间更改为 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

有什么想法吗?

【问题讨论】:

  • datehour 是你写的吗? “不起作用”的程度是 datehour 的类型还是有其他不正确的地方。
  • 什么是newId()
  • 你用的是什么版本的 MySQL?
  • @Nick 我正在使用 mysql 工作台,newId 是行数(它必须是连续的)
  • 不是工作台,是 MySQL 8.0 还是 5.x?

标签: mysql sql select group-by count


【解决方案1】:

尚不清楚您要使用newId() 实现什么目标。除此之外,您可以使用DATE_FORMATSTR_TO_DATE 从时间中去除分钟和秒以获取datehour 值,从而获得所需的结果;然后你可以 GROUP BYproductSUM 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

Demo on 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

Demo on db-fiddle

【讨论】:

  • 它的工作形式是我, datehour 列是 datetime 类型吗? @尼克
  • @hinafaya 是的
  • @hinafaya 我又添加了两个查询(一个用于 MySQL 8+,一个用于 MySQL 5.x),它们将生成您想要的 id 值。
  • 谢谢@Nick mysql 8 的查询对我有用,超棒
  • @hinafaya 不用担心 - 我很高兴能帮上忙。
猜你喜欢
  • 2020-10-26
  • 1970-01-01
  • 2021-03-11
  • 2016-09-13
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多