如何使用Groupby

时间:2018-03-30 18:39:04

标签: sql group-by apache-spark-sql case

我有这个名为pdays的数据:

id|time|date_time| type_id
1  2    2016-03-05 1
2  5    2016-03-05 1
3  3    2016-03-06 2
4  7    2016-03-07 3
5  2    2016-03-10 1
6  1    2016-03-12 3

我想计算按type_id分组的工作日和周末的平均时间(时间)

输出期望如下:

type_id| weekday_time|weekends_time
1        7            2
2        3            0
3        7            1

这是我的想法:

首先我需要从date_time中提取日期编号;第二,确定日期编号是否属于(5,6,12,13,19,20,26,27),这是周末数字(注意:这个数据表示一个月的情况,所以我不需要担心下个月周末日期数的变化);最后,在type_id上​​进行聚合和分组

CASE WHEN pday.date IN(5,6,12,13,19,20,26,27) THEN 'weekend' ELSE 'weekday' END

这是我认为我应该使用的案例部分。

1 个答案:

答案 0 :(得分:1)

首先,您的输出似乎是错误的。 Type_id 3同时包含周末和工作日条目,但您将其中一个输出值显示为0。

这应该可以在SQL Server中获得您想要的内容,并且它非常接近其他RDBMS。如果您更新了RBDMS,我将更改:

;with cte AS (
select type_id, 
CASE WHEN pday.date IN(5,6,12,13,19,20,26,27) THEN 'weekday' ELSE 'weekend' END AS day_type, 
SUM(time) AS time_sum
FROM pdays
GROUP BY 
type_id, 
CASE WHEN pday.date IN(5,6,12,13,19,20,26,27) THEN 'weekday' ELSE 'weekend' END
)

SELECT type_id, 
SUM(CASE WHEN day_type = 'weekday' THEN time_sum ELSE 0 END) AS 'weekday_time',
SUM(CASE WHEN day_type = 'weekend' THEN time_sum ELSE 0 END) AS 'weekend_time'
FROM cte 
GROUP BY [type_id]