假设我的表格如下所示
user_id login_date
1 2019-03-13 00:00:00.000000
1 2019-04-07 00:00:00.000000
1 2018-10-19 00:00:00.000000
1 2018-11-12 00:00:00.000000
1 2018-04-11 00:00:00.000000
6 2018-11-18 00:00:00.000000
6 2018-07-07 00:00:00.000000
6 2019-09-04 00:00:00.000000
6 2018-07-31 00:00:00.000000
6 2019-10-20 00:00:00.000000
12 2018-12-17 00:00:00.000000
12 2018-07-06 00:00:00.000000
12 2018-04-21 00:00:00.000000
12 2019-07-28 00:00:00.000000
48 2018-12-01 00:00:00.000000
48 2019-11-11 00:00:00.000000
48 2019-03-10 00:00:00.000000
48 2018-10-13 00:00:00.000000
48 2019-02-21 00:00:00.000000
48 2018-01-04 00:00:00.000000
我想选择首次登录后前 2 天内的登录。换句话说,首先要找到每个组的最短登录日期,然后选择 48 小时内的登录,或者对每个组内的登录进行排序,然后选择前 2 天内的登录。
这里是创建类似表的 SQL
CREATE TABLE TEST (user_id INT, login_date DATE NOT NULL)
INSERT INTO TEST ( user_id, login_date)
VALUES
(1,'20190901'),
(1,'20140719'),
(1,'20101118'),
(1,'20101119'),
(1,'20141118'),
(6,'20110818'),
(6,'20070119'),
(6,'20090419'),
(6,'20070118'),
(6,'20100219'),
(12,'20120718'),
(12,'20070618'),
(12,'20041218'),
(12,'20041219'),
(48,'20120118'),
(48,'20111119'),
(48,'20031019'),
(48,'20100318'),
(48,'20021119'),
(48,'20010418')
最佳答案
您可以在子查询中使用窗口函数 first_value()
来检索每个组的最早登录日期,然后将其与外部查询中的每个登录日期进行比较:
select
id,
login
from (
select
t.*,
first_value(login) over(
partition by id
order by login
rows between unbounded preceding and unbounded following
) first_login
from mytable t
) t
where login < first_login + interval '2 days'
另一种选择是使用相关子查询进行过滤:
select *
from mytable t
where login < (
select min(login) + interval '2 days'
from mytable t1
where t1.id = t.id
)
关于mysql - 用于选择每组中前 x 个日期的 SQL Redshift 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58983988/