GROUPBY之后的sql过滤产生的结果与mysql不同

cwxwcias  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(267)

我试着从下表中提取所有 cust_id 他们在一月份第一次买了一件东西。
我用mysql找到了一种方法,但我用的是hive,它不起作用
考虑下这张表:

  1. | cust_id | created | year | month | item |
  2. |---------|---------------------|------|-------|------|
  3. | 100 | 2017-01-01 19:20:00 | 2017 | 01 | ABC |
  4. | 100 | 2017-01-01 19:20:00 | 2017 | 01 | DEF |
  5. | 100 | 2017-01-08 22:45:00 | 2017 | 01 | GHI |
  6. | 100 | 2017-08-03 08:01:00 | 2017 | 08 | JKL |
  7. | 100 | 2017-01-01 21:23:00 | 2017 | 01 | MNO |
  8. | 130 | 2016-12-06 06:42:00 | 2016 | 12 | PQR |
  9. | 140 | 2017-01-21 15:01:00 | 2017 | 01 | STU |
  10. | 130 | 2017-01-29 13:20:00 | 2017 | 01 | VWX |
  11. | 140 | 2017-04-10 09:15:00 | 2017 | 04 | YZZ |

通过以下查询,它可以工作:

  1. SELECT
  2. cust_id,
  3. year,
  4. month,
  5. MIN(STR_TO_DATE(created, '%Y-%m-%d %H:%i:%s')) AS min_date
  6. FROM
  7. t1
  8. GROUP BY
  9. cust_id
  10. HAVING
  11. year = '2017'
  12. AND
  13. month= '01'

它返回这个表:

  1. | cust_id | year | month | min_date |
  2. |---------|------|-------|---------------------|
  3. | 100 | 2017 | 01 | 2017-01-01 19:20:00 |
  4. | 140 | 2017 | 01 | 2017-01-21 15:01:00 |

但在 hive 里,我不能过滤田地 year 以及 month 如果他们以前没有被分组过的话。换句话说,前面的查询失败。
相反,以下操作将运行,但不会产生预期结果:

  1. SELECT
  2. cust_id,
  3. year,
  4. month,
  5. MIN(unix_timestamp(created, 'yyyy-MM-dd HH:mm:ss')) AS min_date
  6. FROM
  7. t1
  8. GROUP BY
  9. cust_id, year, month
  10. HAVING
  11. year = '2017'
  12. AND
  13. month= '01'

即使第一次购买发生在2016年12月,客户id 130也会出现

  1. | cust_id | year | month | min_date |
  2. |---------|------|-------|---------------------|
  3. | 100 | 2017 | 01 | 2017-01-01 19:20:00 |
  4. | 130 | 2017 | 01 | 2017-01-29 13:20:00 |
  5. | 140 | 2017 | 01 | 2017-01-21 15:01:00 |

这里是小提琴:sql小提琴
谢谢您

pw9qyyiw

pw9qyyiw1#

您的mysql查询实际上不起作用,即使它运行。在列表中永远不要有“裸”列 group by 或者 having 或者 order by (指聚合查询)。所有非聚合列都应该是聚合函数的参数。就你而言, year 以及 month 属于这一类。
在两个数据库中,您似乎需要的内容如下所示:

  1. SELECT cust_id
  2. FROM t1
  3. GROUP BY cust_id
  4. HAVING MIN(created) >= '2017-01-01' AND
  5. MIN(created) < '2017-02-01';

相关问题