Postgres:计算不同日期的多个事件
Postgres: Count multiple events for distinct dates
Stack Overflow 的人!
感谢您花时间阅读这个问题。我想要完成的是仅从一个 table 中转换一些数据。
原始 table 具有特定事件的多个日期时间条目(例如,何时添加客户 add_time
以及何时失去客户 lost_time
)。
这是两行交易的一部分 table:
编号
add_time
last_mail_time
lost_time
5
2020-03-2409:29:24
2020-04-0313:20:29
空
310
2020-03-2409:29:24
空
2020-04-0313:20:29
我想创建一个视图 table。一个视图,每个不同的日期各占一行,并计算该特定时间的事件数。
这是目标(时间与示例不符!):
我有工作代码,像这样:
SELECT DISTINCT
change_datetime,
(SELECT COUNT(add_time) as add_time_count FROM deals WHERE add_time::date = change_datetime),
(SELECT COUNT(lost_time) as lost_time_count FROM deals WHERE lost_time::date = change_datetime)
FROM (
SELECT
add_time::date AS change_datetime
FROM
deals
UNION ALL
SELECT
lost_time::date AS change_datetime
FROM
deals
) AS foo
WHERE change_datetime IS NOT NULL
ORDER BY
change_datetime;
但这有一些难看的 O(n2) 查询并且需要很多时间。
是否有更好、更高效的方法来实现这一点?
谢谢!!
您可以使用横向连接来反透视然后聚合:
select t::date,
count(*) filter (where which = 'add'),
count(*) filter (where which = 'mail'),
count(*) filter (where which = 'lost')
from deals d cross join lateral
(values (add_time, 'add'),
(last_mail_time, 'mail'),
(lost_time, 'lost')
) v(t, which)
group by t::date;
Stack Overflow 的人!
感谢您花时间阅读这个问题。我想要完成的是仅从一个 table 中转换一些数据。
原始 table 具有特定事件的多个日期时间条目(例如,何时添加客户 add_time
以及何时失去客户 lost_time
)。
这是两行交易的一部分 table:
编号 | add_time | last_mail_time | lost_time |
---|---|---|---|
5 | 2020-03-2409:29:24 | 2020-04-0313:20:29 | 空 |
310 | 2020-03-2409:29:24 | 空 | 2020-04-0313:20:29 |
我想创建一个视图 table。一个视图,每个不同的日期各占一行,并计算该特定时间的事件数。
这是目标(时间与示例不符!):
我有工作代码,像这样:
SELECT DISTINCT
change_datetime,
(SELECT COUNT(add_time) as add_time_count FROM deals WHERE add_time::date = change_datetime),
(SELECT COUNT(lost_time) as lost_time_count FROM deals WHERE lost_time::date = change_datetime)
FROM (
SELECT
add_time::date AS change_datetime
FROM
deals
UNION ALL
SELECT
lost_time::date AS change_datetime
FROM
deals
) AS foo
WHERE change_datetime IS NOT NULL
ORDER BY
change_datetime;
但这有一些难看的 O(n2) 查询并且需要很多时间。
是否有更好、更高效的方法来实现这一点?
谢谢!!
您可以使用横向连接来反透视然后聚合:
select t::date,
count(*) filter (where which = 'add'),
count(*) filter (where which = 'mail'),
count(*) filter (where which = 'lost')
from deals d cross join lateral
(values (add_time, 'add'),
(last_mail_time, 'mail'),
(lost_time, 'lost')
) v(t, which)
group by t::date;