如何通过从多个订单项之一中获取值来创建标题记录?

时间:2019-04-18 18:24:51

标签: sql sql-server tsql ssis sql-server-data-tools

我有一组已排序的订单项。它们首先按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的第一行在目标表中提供DescriptionDate。每个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 …) 不同,因为它试图确定一种方法。该问题的提问者采用了一种方法,此处的答案已标识出一种以上的方法。这个问题是关于如何使这种特定方法起作用的。

4 个答案:

答案 0 :(得分:3)

相关子查询将在这里提供帮助:

 SELECT *
 FROM yourtable t1
 WHERE [Date] = (SELECT min([Date]) FROM yourtable WHERE id = t1.id)

答案 1 :(得分:3)

您可以使用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;

答案 2 :(得分:2)

使用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

答案 3 :(得分:2)

您可以使用ROW_NUMBER()窗口功能执行此操作。例如:

select *
from (
  select
    id, description, date,
    row_number() over(partition by id order by date) as rn
  from t
)
where rn = 1