我有一组排序的订单项。它们首先由ID
排序,然后由Date
排序:
| ID | DESCRIPTION | Date |
| --- | ----------- |----------|
| 100 | Red |2019-01-01|
| 101 | White |2019-01-01|
| 101 | White_v2 |2019-02-01|
| 102 | Red_Trim |2019-01-15|
| 102 | White |2019-01-16|
| 102 | Blue |2019-01-20|
| 103 | Red_v3 |2019-01-14|
| 103 | Red_v3 |2019-03-14|
我需要在SQL Server表中插入行,表示项目标题,以便每个ID的第一行在目标表中提供Description
和Date
。每个ID的目标表中只应有一行。
例如,上面的源表将在目标中产生:
| ID | DESCRIPTION | Date |
| --- | ----------- |----------|
| 100 | Red |2019-01-01|
| 101 | White |2019-01-01|
| 102 | Red_Trim |2019-01-15|
| 103 | Red_v3 |2019-01-14|
如何折叠源,以便我只从源中获取每个ID
的第一行?
我更喜欢在SSIS中进行转换,但如果需要可以使用SQL。实际上,两种方法的解决方案都是最有帮助的。
这个问题与Trouble using ROW_NUMBER() OVER (PARTITION BY …) 不同,因为它试图找出一种方法。该问题的提问者采用了一种方法,这种方法可以通过答案确定。这个问题是关于如何使这种特定方法发挥作用。
使用first_value
窗口功能
select * from (select *,
first_value(DESCRIPTION) over(partition by id order by Date) as des,
row_number() over(partition by id order by Date) rn
from table
) a where a.rn =1
你可以使用row_number()
:
select t.*
from (select t.*, row_number() over (partition by id order by date) as seq
from table t
) t
where seq = 1;
相关子查询将在这里有所帮助:
SELECT *
FROM yourtable t1
WHERE [Date] = (SELECT min([Date]) FROM yourtable WHERE id = t1.id)
您可以使用ROW_NUMBER()
窗口函数来执行此操作。例如:
select *
from (
select
id, description, date,
row_number() over(partition by id order by date) as rn
from t
)
where rn = 1