我试着从下表中提取所有 cust_id
他们在一月份第一次买了一件东西。
我用mysql找到了一种方法,但我用的是hive,它不起作用
考虑下这张表:
| cust_id | created | year | month | item |
|---------|---------------------|------|-------|------|
| 100 | 2017-01-01 19:20:00 | 2017 | 01 | ABC |
| 100 | 2017-01-01 19:20:00 | 2017 | 01 | DEF |
| 100 | 2017-01-08 22:45:00 | 2017 | 01 | GHI |
| 100 | 2017-08-03 08:01:00 | 2017 | 08 | JKL |
| 100 | 2017-01-01 21:23:00 | 2017 | 01 | MNO |
| 130 | 2016-12-06 06:42:00 | 2016 | 12 | PQR |
| 140 | 2017-01-21 15:01:00 | 2017 | 01 | STU |
| 130 | 2017-01-29 13:20:00 | 2017 | 01 | VWX |
| 140 | 2017-04-10 09:15:00 | 2017 | 04 | YZZ |
通过以下查询,它可以工作:
SELECT
cust_id,
year,
month,
MIN(STR_TO_DATE(created, '%Y-%m-%d %H:%i:%s')) AS min_date
FROM
t1
GROUP BY
cust_id
HAVING
year = '2017'
AND
month= '01'
它返回这个表:
| cust_id | year | month | min_date |
|---------|------|-------|---------------------|
| 100 | 2017 | 01 | 2017-01-01 19:20:00 |
| 140 | 2017 | 01 | 2017-01-21 15:01:00 |
但在 hive 里,我不能过滤田地 year
以及 month
如果他们以前没有被分组过的话。换句话说,前面的查询失败。
相反,以下操作将运行,但不会产生预期结果:
SELECT
cust_id,
year,
month,
MIN(unix_timestamp(created, 'yyyy-MM-dd HH:mm:ss')) AS min_date
FROM
t1
GROUP BY
cust_id, year, month
HAVING
year = '2017'
AND
month= '01'
即使第一次购买发生在2016年12月,客户id 130也会出现
| cust_id | year | month | min_date |
|---------|------|-------|---------------------|
| 100 | 2017 | 01 | 2017-01-01 19:20:00 |
| 130 | 2017 | 01 | 2017-01-29 13:20:00 |
| 140 | 2017 | 01 | 2017-01-21 15:01:00 |
这里是小提琴:sql小提琴
谢谢您
1条答案
按热度按时间pw9qyyiw1#
您的mysql查询实际上不起作用,即使它运行。在列表中永远不要有“裸”列
group by
或者having
或者order by
(指聚合查询)。所有非聚合列都应该是聚合函数的参数。就你而言,year
以及month
属于这一类。在两个数据库中,您似乎需要的内容如下所示: