У меня есть набор отсортированных позиций. Они сортируются сначала по 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…) тем, что он направлен на определение подхода. Задавший этот вопрос принял один подход из нескольких доступных, как указано в ответах здесь. Этот вопрос о том, как заставить этот конкретный подход работать.
Ах, спасибо @JNevil и другим за указание на это. Это было непреднамеренно. Я думаю, что на практике это будет datetime.
Я надеялся, что ты это скажешь. Настоящая хитрость заключается в том, что, как бы вы ни установили свой порядок, он должен присутствовать либо в предложении ORDER 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
Здесь поможет коррелированный подзапрос:
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
Вы можете использовать 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;
Я добавил ответ, однако запись
102имеет две записи для минимальной (даты). Как бы здесь решить, чтоRed_Trim— это описание «Заголовок». Я не вижу способа определить, чтоRed_Trimболее правильно, чемWhiteдля записи102. Любой другой ответ здесь с использованием оконной функцииROW_NUMBERбудет страдать от той же проблемы, но немного скроет проблему. В зависимости от того, как себя чувствует сервер sql, вы либо получитеWhite, либоRed_Trimот sql.