【发布时间】:2019-01-29 17:32:38
【问题描述】:
目标:我想根据 Id 列的第一个值加入两个表,该列按按 created_at 列排序的订阅 Id 列分组。
情况:
Table1 如下所示:
id channel trx_date
123 organic 01/01/2019 05:00:00
234 direct 01/01/2019 05:01:00
987 add 01/01/2019 10:00:00
654 organic 01/01/2019 10:15:00
表2:
subscription_id id os created_at
sub890 123 mac 01/01/2019 05:00:01
sub890 234 mac 01/01/2019 05:01:01
sub111 987 windows 01/01/2019 10:00:01
sub111 654 mac 01/01/2019 10:20:01
我需要取表 2 中按订阅 ID 分组的最早 ID,并将其与表 1 内联。 所以在这个例子中,我的输出是
subscription_id id os created_at id channel trx_date
sub890 123 mac 01/01/2019 05:00:01 organic 01/01/2019 05:00:00
sub111 987 windows 01/01/2019 10:00:01 add 01/01/2019 10:00:00
我尝试了什么:我考虑过使用 FIRST_VALUE,但我不知道如何连接它们
SELECT t1.*,
t2.subscription_id,
t2.os,
t2.created_at,
FIRST_VALUE(t2.id) OVER (PARTITION BY t2.subscription_id ORDER BY t2.created_at ASC) as Min_Id
FROM table1 t1
INNER JOIN table2 t2 ON t1.id = t2.Min_id
小提琴信息:
CREATE TABLE table1
([id] varchar(13), [channel] varchar(50), [trx_date] Datetime)
INSERT INTO table1
VALUES
('123', 'organic', '2019-01-01 05:00:00'),
('234', 'direct', '2019-01-01 05:01:00'),
('987', 'add', '2019-01-01 10:00:00'),
('654', 'organic', '2019-01-01 10:15:00')
CREATE TABLE table2
([subscription_id] varchar(13),[id] varchar(13), [os] varchar(10), [created_at] Datetime)
INSERT INTO table2
VALUES
('sub890', '123', 'mac', '2019-01-01 05:00:01'),
('sub890', '234', 'mac', '2019-01-01 05:01:01'),
('sub111', '987', 'windows', '2019-01-01 10:00:01'),
('sub111', '654', 'mac', '2019-01-01 10:20:01')
显然,由于 ON 子句,这不起作用。这种情况是否需要一个带有交叉应用的 row_number 函数?有没有更好的方法来做到这一点? FIRST_VALUE 是不是用错了函数?
【问题讨论】:
标签: sql sql-server inner-join partitioning