Как создать записи заголовка, взяв значения из одной из нескольких позиций? - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть набор отсортированных позиций.Сначала они сортируются по 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, которая представляет заголовок проекта, чтобы первая строка для каждого идентификатора предоставлялаDescription и Date в таблице назначения.Для каждого идентификатора должна быть только одна строка в таблице назначения.

Например, приведенная выше исходная таблица может привести к этому в месте назначения:

| 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.На самом деле, решения для обоих методов были бы наиболее полезны.


Этот вопрос отличается от Проблема с использованием ROW_NUMBER () OVER (PARTITION BY…) в том, что это стремится копределить подход.Задавший этот вопрос принял один подход, более чем один из доступных, как указано в ответах здесь.Этот вопрос о том, как заставить этот конкретный подход работать.

Ответы [ 4 ]

4 голосов
/ 18 апреля 2019

Вы можете использовать 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;
4 голосов
/ 18 апреля 2019

Здесь поможет коррелированный подзапрос:

 SELECT *
 FROM yourtable t1
 WHERE [Date] = (SELECT min([Date]) FROM yourtable WHERE id = t1.id)
3 голосов
/ 18 апреля 2019

Вы можете использовать оконную функцию ROW_NUMBER(), чтобы сделать это.Например:

select *
from (
  select
    id, description, date,
    row_number() over(partition by id order by date) as rn
  from t
)
where rn = 1
3 голосов
/ 18 апреля 2019

использование 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...