【问题标题】:How deal with this issue in SQL with Groupby如何使用 Group By 在 SQL 中处理这个问题
【发布时间】:2023-03-24 10:23:01
【问题描述】:

我有这个名为 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 分组的工作日和周末的平均时间 SUM(time)

输出期望是这样的:

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

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

【问题讨论】:

  • 您的案例陈述会在下个月临近而 5 号和 6 号不在周末时立即崩溃。每个 RDBMS 都有某种形式的 DATEPART 函数,它将返回星期几,您可以从中收集工作日和周末。
  • 这只是一个月的情况,所以我不用担心下个月的数字变化
  • 您使用的是什么关系型数据库? MySQL、Sql Server 等
  • 我正在使用 spark.sql

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


【解决方案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] 

【讨论】:

  • 我想知道如果数据类型是 VARCHAR(10),pday.date 是否可以工作。谢谢
猜你喜欢
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多