根据按 Id 分区的日期列获取列的第一个值
Get the first value of a column based on a date column partitioned by Id
目标: 我希望我的输出显示每个不同的 subscription_id,第一个 transaction_id 基于最早的日期。
问题: subscription_id 在我的输出中不明显。
情况: 我在一个 table 中有几列,但只有三列有用:
- subscription_id
- transaction_id
- issue_date
每个 subscription_id 可以有多个 transaction_id。我需要根据最早的日期为每个 subscription_id 选择第一个 transation_id。
查询: 我尝试了以下两个查询,认为它们应该给我相同的结果,但两者不同。此外,当只有 DISTINCT
subscription_id 应该出来时,两个 return 重复 subcription_ids。
SELECT DISTINCT t.subscription_id
,t.transation_id
,MIN(t.issue_date) As Min_Id
FROM table AS t
WHERE issue_date >= '2019-01-21'
GROUP BY t.subscription_id, t.transation_id
ORDER BY subscription_id desc
SELECT DISTINCT t.subscription_id
,FIRST_VALUE(t.transation_id)
OVER (PARTITION BY t.subscription_id ORDER BY t.issue_date ASC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS Min_id
,issue_date
FROM table AS t
WHERE issue_date >= '2019-01-21'
ORDER BY subscription_id desc
我运行模拟了数据并且它起作用了。
INSERT INTO #test1
VALUES
('2018-11-01', 'ABC@gmail.com')
,('2018-11-02', 'ABC@gmail.com')
,('2018-11-03', 'ABC@gmail.com')
,('2018-07-01', 'DEF@gmail.com')
,('2018-07-02', 'DEF@gmail.com')
SELECT DISTINCT EMAIL
,FIRST_VALUE(login_time)
OVER(PARTITION BY email ORDER BY LOGIN_TIME ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS DATES
FROM #test1
Mock-up Output:
EMAIL DATES
ABC@gmail.com 2018-11-01
DEF@gmail.com 2018-07-01
我哪里做错了或者有什么不同?
你可以像下面这样使用子查询
select * from
(SELECT *,
row_number() OVER(PARTITION BY email ORDER BY LOGIN_TIME) AS rn
FROM #test1
) t where t.rn=1
目标: 我希望我的输出显示每个不同的 subscription_id,第一个 transaction_id 基于最早的日期。
问题: subscription_id 在我的输出中不明显。
情况: 我在一个 table 中有几列,但只有三列有用:
- subscription_id
- transaction_id
- issue_date
每个 subscription_id 可以有多个 transaction_id。我需要根据最早的日期为每个 subscription_id 选择第一个 transation_id。
查询: 我尝试了以下两个查询,认为它们应该给我相同的结果,但两者不同。此外,当只有 DISTINCT
subscription_id 应该出来时,两个 return 重复 subcription_ids。
SELECT DISTINCT t.subscription_id
,t.transation_id
,MIN(t.issue_date) As Min_Id
FROM table AS t
WHERE issue_date >= '2019-01-21'
GROUP BY t.subscription_id, t.transation_id
ORDER BY subscription_id desc
SELECT DISTINCT t.subscription_id
,FIRST_VALUE(t.transation_id)
OVER (PARTITION BY t.subscription_id ORDER BY t.issue_date ASC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS Min_id
,issue_date
FROM table AS t
WHERE issue_date >= '2019-01-21'
ORDER BY subscription_id desc
我运行模拟了数据并且它起作用了。
INSERT INTO #test1
VALUES
('2018-11-01', 'ABC@gmail.com')
,('2018-11-02', 'ABC@gmail.com')
,('2018-11-03', 'ABC@gmail.com')
,('2018-07-01', 'DEF@gmail.com')
,('2018-07-02', 'DEF@gmail.com')
SELECT DISTINCT EMAIL
,FIRST_VALUE(login_time)
OVER(PARTITION BY email ORDER BY LOGIN_TIME ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS DATES
FROM #test1
Mock-up Output:
EMAIL DATES
ABC@gmail.com 2018-11-01
DEF@gmail.com 2018-07-01
我哪里做错了或者有什么不同?
你可以像下面这样使用子查询
select * from
(SELECT *,
row_number() OVER(PARTITION BY email ORDER BY LOGIN_TIME) AS rn
FROM #test1
) t where t.rn=1