Опустите повторяющиеся значения в одном столбце и покажите остальные

#select

Вопрос:

Я начинаю с SQL, поэтому мой вопрос будет для вас легким.

У меня есть одна таблица со многими столбцами. Наиболее важными являются [Номер теста] и [Время начала]. [Номер теста] содержит много повторяющихся строк, а [Время начала] всегда содержит уникальные записи. И теперь я хочу показать в результатах все столбцы таблицы, где будет использоваться только [Номер теста] с максимальным [временем начала].

Я смог создать один результат относительно максимального [времени начала]

 SELECT MAX([Start time])
FROM [Testing_ADB_Overview].[dbo].[HTT_DB]
GROUP BY [Test number]
ORDER BY MAX([Start time])
 

но я не знаю, как я могу применить его, чтобы увидеть в результатах все остальные столбцы. Не могли бы вы, пожалуйста, помочь мне?

МФ

Комментарии:

1. Помогите нам помочь — поделитесь некоторыми образцами данных и результатом, который вы хотели бы получить

2. Время начала-nvarchar в этом формате: 190923_132819 (год_часа_часа_векунды)

Ответ №1:

Постарайся получить [Test number] то, что нужно напоследок [Stat time] . Вы можете сделать это двумя способами:

  1. Сохраните в переменной ( @MaxStatTime ) результат максимального значения из вашего выбора. Сделайте запрос [Test number] со следующим условием where [Start time] = @MaxStartTime и сохраните его в другой переменной ( @LastTestNumber ). И просто извлеките строки из вашей таблицы, соответствующие @LastTestNumber .
  2. Используя эту ROW_NUMBER() функцию, вы можете упорядочить свои строки в таблице по убыванию по [Stat time] столбцу. Затем , отфильтровав таблицу для row_number() = 1 , вы можете получить [Test number] и снова извлечь строки из своей таблицы.

Мне не очень нравится 1-е решение, поэтому я пропущу его реализацию, но вот реализация 2-го решения с использованием общего табличного выражения, чтобы сделать его более читаемым:

 IF OBJECT_ID('tempdb.dbo.#HTT_DB') IS NOT NULL DROP TABLE #HTT_DB
    CREATE TABLE #HTT_DB 
        ( [Test number] NVARCHAR(100)
        , [Start time] NVARCHAR(100)
        )

INSERT INTO #HTT_DB( [Test number], [Start time] )
VALUES
    ('AA' , '210525_090000')
    ,('BB', '210525_080000') 
    ,('CC', '210525_070000') 
    ,('BB', '210525_060000') 
    ,('AA', '210525_050000') 

;WITH OrderedTestNumber AS (SELECT [Test number], [Start time], ROW_NUMBER()  OVER ( PARTITION BY [Test number] ORDER BY [Start time] DESC) RowNo FROM #HTT_DB)
SELECT htt.* 
FROM #HTT_DB  htt INNER JOIN OrderedTestNumber otm ON otm.[Test number] = htt.[Test number] AND otm.[Start time] = htt.[Start time]
WHERE otm.RowNo = 1
 

Выход:

Номер теста Время начала
aa 210525_090000
бб 210525_080000
куб.см 210525_070000

Я бы настоятельно рекомендовал добавить столбец первичного ключа в таблицу ta [HTT_DB], скажем, PK_Column для простоты. Запрос будет упрощен следующим образом:

 ;WITH OrderedTestNumber AS (SELECT PK_Column, ROW_NUMBER()  OVER ( PARTITION BY [Test number] ORDER BY [Start time] DESC) RowNo FROM #HTT_DB)
SELECT htt.* 
FROM #HTT_DB  htt INNER JOIN OrderedTestNumber otm ON otm.PK_Column = htt.PK_Column
WHERE otm.RowNo = 1
 

Комментарии:

1. Привет, лакта, спасибо тебе за твои усилия и ответ. Я попробовал ваше решение (просто скопируйте и вставьте), но получил ошибки: Msg 10753, уровень 15, Состояние 3, Строка 2 Функция «НОМЕР строки» должна иметь предложение OVER. Msg 156, Уровень 15, Состояние 1, Строка 4 Неправильный синтаксис рядом с ключевым словом «ВВЕРХУ». Как новичок, я не знаю, как с этим справиться. Я сделал какую-то ошибку? Или я должен что-то заявить? Мне очень нравится второе решение — мне кажется, оно действительно хорошее. Спасибо вам и хорошего дня!

2. Извините, это была опечатка. Я отредактировал ответ.

3. Привет, лакта, спасибо, теперь это работает! Но не так, как я хотел… Моя таблица: [Номер теста], [Дата начала] AA , 210525_090000 BB , 210525_080000 CC , 210525_070000 BB, 210525_060000 AA 210525_050000 Может случиться (и случается), что даже если тесты отсортированы по времени, между ними будут проходить другие тесты. Результат [Номер теста] появляется несколько раз. Я думаю, что это можно было бы предотвратить, используя эту ГРУППУ по [номеру теста] в вашем коде. Это гарантирует, что в результате будет получено только [Номер теста] с самым последним (самым высоким) временем. я прав? Спасибо

4. Извините, кажется, я неправильно истолковал ваш вопрос. Это является причиной для запроса выборочных данных и предпочтительного результата. Есть ли у вашей таблицы первичный ключ? У меня сложилось впечатление, что [Номер теста] будет первичным ключом и может использоваться для определения выбора правильной строки. Ваш желаемый результат-AA, 210525_090000 BB, 210525_080000 CC, 210525_070000 ?

5. Я отредактировал свой ответ с образцами данных. [Номер теста] не может быть первичным ключом, он должен быть уникальным