Как создать записи заголовков, взяв значения из одной из нескольких позиций?

У меня есть набор отсортированных позиций. Они сортируются сначала по 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…) тем, что он направлен на определение подхода. Задавший этот вопрос принял один подход из нескольких доступных, как указано в ответах здесь. Этот вопрос о том, как заставить этот конкретный подход работать.

Я добавил ответ, однако запись 102 имеет две записи для минимальной (даты). Как бы здесь решить, что Red_Trim — это описание «Заголовок». Я не вижу способа определить, что Red_Trim более правильно, чем White для записи 102. Любой другой ответ здесь с использованием оконной функции ROW_NUMBER будет страдать от той же проблемы, но немного скроет проблему. В зависимости от того, как себя чувствует сервер sql, вы либо получите White, либо Red_Trim от sql.

JNevill 18.04.2019 20:30

Ах, спасибо @JNevil и другим за указание на это. Это было непреднамеренно. Я думаю, что на практике это будет datetime.

Trevor Reid 18.04.2019 20:34

Я надеялся, что ты это скажешь. Настоящая хитрость заключается в том, что, как бы вы ни установили свой порядок, он должен присутствовать либо в предложении ORDER BY оконной функции (если вы идете по этому пути), либо учитываться для решения коррелированного подзапроса.

JNevill 18.04.2019 20:37
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
3
129
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

использовать 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;

Другие вопросы по теме