#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]
. Вы можете сделать это двумя способами:
- Сохраните в переменной (
@MaxStatTime
) результат максимального значения из вашего выбора. Сделайте запрос[Test number]
со следующим условием where[Start time] = @MaxStartTime
и сохраните его в другой переменной (@LastTestNumber
). И просто извлеките строки из вашей таблицы, соответствующие@LastTestNumber
. - Используя эту
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. Я отредактировал свой ответ с образцами данных. [Номер теста] не может быть первичным ключом, он должен быть уникальным