有没有办法在 SQL 中按列名对两个日期列进行分类?
Posted
技术标签:
【中文标题】有没有办法在 SQL 中按列名对两个日期列进行分类?【英文标题】:Is there a way to classify two date columns by column name in SQL? 【发布时间】:2021-03-24 15:22:48 【问题描述】:PostgreSQL 8.0.2; Redshift中的表格
我有一个表格,其中包含两个日期列,分别代表案例的开始日期和结束日期。我正在尝试每周计算每周有多少案件开始和解决。
表格
该表包含案例 ID、案例开始日期、开始周、案例解决日期、解决周:
case_id | start_date | start_week | resolved_date | resolved_week
--------+------------+------------+---------------+--------------
101 | 2020-01-01 | 1 | 2020-01-09 | 2
102 | 2020-01-01 | 1 | 2020-01-11 | 2
103 | 2020-01-09 | 2 | 2020-01-11 | 2
104 | 2020-01-10 | 2 | 2020-01-12 | 2
105 | 2020-01-17 | 3 | 2020-01-18 | 3
106 | 2020-01-25 | 4 | 2020-01-25 | 4
期望的结果
我需要按“第 # 周”组织数据,并计算开始和解决的案例数量,如下所示:
week | date_type | count
-----+-----------+------
1 | start | 2
2 | start | 2
2 | resolved | 4
3 | start | 1
3 | resolved | 1
4 | start | 1
4 | resolved | 1
一开始我以为可以用CASE
语句把日期分为start和resolved两类,但我觉得CASE
只能用在记录中,而不是在列中。
我在SELECT
子句中尝试了COALESCE
,这确实将所有日期合并为一列,但我不知道如何将它们分成start 和已解决:
SELECT COALESCE(start_date, resolved_date) as "week", COUNT(case_id)
FROM table_1
GROUP BY 1;
当前结果
生产:
week | count
-----+------
1 | 2
2 | 6
3 | 2
4 | 2
【问题讨论】:
您使用的是 Postgres 还是 Redshift?虽然它们有一些关系,但它们不是一回事。select version();
给出“i686-pc-linux-gnu 上的 PostgreSQL 8.0.2......Redshift 1.0.24421”
“CASE 只能在记录中使用,不能与列一起使用” - 抱歉,这是完全倒退的。在数据库术语中,记录被称为行(又名元组)。和行一致的列。现在将我们限制在该域中,CASE 只能用于列而不是行。
【参考方案1】:
在 Redshift 中,您可以使用 union all
取消透视然后聚合:
select week, what, count(*)
from ((select start_week as week, 'start' as what
from t
) union all
(select resolved_week as week, 'resolved' as what
from t
)
) w
group by week, what
order by week;
【讨论】:
以上是关于有没有办法在 SQL 中按列名对两个日期列进行分类?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL Server 中按日期列排序的组中对列进行排名