有没有办法在 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语句把日期分为startresolved两类,但我觉得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 中按日期列排序的组中对列进行排名

如何在 Pandas 数据框中按行值对日期时间列进行排序?

在 FAR 管理器中按日期对文件进行排序

pandas 如何使用 groupby 在标签中按日期对列进行分组?

SQL 动态数据透视表列顺序

具有可变列名的动态更新语句