Postgresql ,与 group by 相对
Postgresql , opposite of a group by
这是我的用例:
我们有一个类似分析的工具,用于计算我们系统上每小时的用户数量。而现在企业希望拥有独立用户的数量。由于我们的用户量很小,我们将使用
SELECT count(*)
FROM (
SELECT DISTINCT user_id
FROM unique users
WHERE date BETWEEN x and y
) distinct_users
即我们将存储一对 user_id, date
并使用 DISTINCT
计算唯一用户数(user_id 不是外键,因为用户未登录,它只是一个唯一标识符由系统生成,某种 uuidv4 )
这在大量数据的性能方面非常有效。
现在的问题是在其中导入遗留数据
我想知道要转换的SQL查询
date | number_of_users
12:00 | 2
13:00 | 4
进入
date | user_id
12:00 | 1
12:00 | 2
13:00 | 1
13:00 | 2
13:00 | 3
13:00 | 4
(只要"count but not unique" returns和之前一样,"unique users count"稍微偏一点就好了)
当然,我可以做一个 python 脚本,但我想知道是否有一个 SQL 技巧可以做到这一点,使用 generate_series
或相关的东西
generate_series()
确实是要走的路:
with data (date, number_of_users) as (
values
('12:00',2),
('13:00',4)
)
select d.date, i.n
from data d
cross join lateral generate_series(1, d.number_of_users) i (n)
order by d.date, i.n ;
这是我的用例:
我们有一个类似分析的工具,用于计算我们系统上每小时的用户数量。而现在企业希望拥有独立用户的数量。由于我们的用户量很小,我们将使用
SELECT count(*)
FROM (
SELECT DISTINCT user_id
FROM unique users
WHERE date BETWEEN x and y
) distinct_users
即我们将存储一对 user_id, date
并使用 DISTINCT
计算唯一用户数(user_id 不是外键,因为用户未登录,它只是一个唯一标识符由系统生成,某种 uuidv4 )
这在大量数据的性能方面非常有效。
现在的问题是在其中导入遗留数据
我想知道要转换的SQL查询
date | number_of_users
12:00 | 2
13:00 | 4
进入
date | user_id
12:00 | 1
12:00 | 2
13:00 | 1
13:00 | 2
13:00 | 3
13:00 | 4
(只要"count but not unique" returns和之前一样,"unique users count"稍微偏一点就好了)
当然,我可以做一个 python 脚本,但我想知道是否有一个 SQL 技巧可以做到这一点,使用 generate_series
或相关的东西
generate_series()
确实是要走的路:
with data (date, number_of_users) as (
values
('12:00',2),
('13:00',4)
)
select d.date, i.n
from data d
cross join lateral generate_series(1, d.number_of_users) i (n)
order by d.date, i.n ;