首页 > 解决方案 > 如何计算两个日期列的出现次数并仅在一张表中显示?

问题描述

我正在构建一个查询,旨在显示每月两个日期变量的出现次数。我能够组装两个单独的查询:我计算每月的出现次数和组数,但我不知道如何加入这两个查询,因为它们来自同一个表,并且仍然只显示一列的计数月。

谢谢你们的帮助,伙计们!

格式:YYYY-MM-DD

|----------------------|------------------|
| 登机日期 | offboard_date |
|----------------------|------------------|
| 2019/01/15 | - |
|----------------------|------------------|
| 2019/01/25 | 2019/02/15 |
|----------------------|------------------|
| 2019/02/13 | 2019/02/20 |
|----------------------|------------------|
| 2019/02/18 | - |
|----------------------|------------------|
| 2019/03/09 | - |
|----------------------|------------------|

我尝试过的和工作过的:

SELECT DATE_TRUNC('month', onboard_date) AS onboard_month,
        COUNT(*) as onboards
FROM lukla.trn_users trn
WHERE trn.company_name = 'amaro'
GROUP BY DATE_TRUNC('month', onboard_date)
ORDER BY DATE_TRUNC('month', onboard_date) 

SELECT DATE_TRUNC('month', offboard_date) AS onboard_month,
        COUNT(*) as onboards
FROM lukla.trn_users trn
WHERE trn.company_name = 'amaro' AND offboard_date IS NOT NULL 
GROUP BY DATE_TRUNC('month', offboard_date)
ORDER BY DATE_TRUNC('month', offboard_date)

我想要的结果:

|---------------|------------|------------|
| 月 | 板载 | 船外 |
|---------------|------------|------------|
| 01 | 2 | 0 |
|---------------|------------|------------|
| 02 | 2 | 2 |
|---------------|------------|------------|
| 03 | 1 | 0 |
|---------------|------------|------------|

标签: sqlpostgresql

解决方案


横向连接使这非常简单:

select date_trunc('month', v.dte) as month, sum(v.is_onboard) as onboards, sum(v.is_offboard) as offboards
from trn_users t cross join lateral
     (values (t.onboard_date, (t.onboard_date is not null)::int, 0),
             (t.offboard_date, 0, (t.offboard_date is not null)::int)
     ) v(dte, is_onboard, is_offboard)
where v.dte is not null
group by month
order by month;

是一个 db<>fiddle。


推荐阅读