#sql #sql-server-2008
#sql #sql-server-2008
Вопрос:
ID Username ModifiedDate
1 A.BEENA 2009-12-07 04:48:17.980
2 A.BEENA 2009-11-17 06:02:27.443
3 Abhilash 2009-12-07 04:48:17.980
4 abhilash.r 2009-12-07 04:48:17.980
5 AJI 2009-11-17 06:02:27.443
6 haris 2009-12-07 04:48:17.980
7 haris 2009-11-17 06:02:27.443
Я хочу выбрать сведения обо всех отдельных пользователях, упорядоченных по ModifiedDate.
Мне нужен вывод, подобный этому
1 A.BEENA 2009-12-07 04:48:17.980
3 Abhilash 2009-12-07 04:48:17.980
4 abhilash.r 2009-12-07 04:48:17.980
5 AJI 2009-11-17 06:02:27.443
6 haris 2009-12-07 04:48:17.980
Пожалуйста, помогите мне
Комментарии:
1. Есть ли и другие столбцы, или у вас действительно есть только имя пользователя и дата?
2. Если это большая таблица, не забудьте присвоить ей надлежащую индексацию на основе выбранного вами решения.
3. В этом конкретном случае вам следует указать на это, потому что, основываясь на ваших данных примера, решение довольно тривиально, если вы не знаете, что вам нужна целая строка данных, которая принадлежит строке, содержащей максимальную измененную дату.
4. Спасибо за отзыв. я изменил вопрос
Ответ №1:
Используйте следующий запрос:
WITH CTE (DuplicateCount,Username,ModifiedDate) AS
(
SELECT
ROW_NUMBER() OVER (PARTITION BY Username ORDER BY ModifiedDate DESC) AS DuplicateCount,
Username,
ModifiedDate
FROM YourTable
)
SELECT *
FROM CTE
WHERE DuplicateCount = 1
Комментарии:
1. 1: Это фактически даст вам всю запись с максимальной датой изменения.
2. Нет, это дает вам три столбца DuplicateCount (всегда 1), Username и ModifiedDate. Это можно было бы очень легко изменить, чтобы включить любые дополнительные столбцы, но оно было помечено как ответ без них.
Ответ №2:
SELECT Username, MAX(ModifiedDate) AS LastModified
FROM MyTable
GROUP BY Username
Это выдаст упомянутый вами результат, который, по-видимому, показывает самую последнюю дату для каждого имени пользователя.
Комментарии:
1. Но это сработает только в том случае, если ему требуется только максимальная дата изменения, а не тогда, когда ему требуется вся строка с максимальной датой изменения (отсюда мой комментарий к вопросу). Я думаю, что он представил упрощенный пример своих данных. Он должен был добавить еще один столбец, чтобы усложнить проблему.
2. Да, но это все, что в данный момент запрашивается. Если ему тоже нужен идентификатор, то ответ, конечно, будет другим.
3. @CodeMyMoonlight: Мои ожидания, очевидно, были правильными. Иногда, когда вопрос недостаточно ясен, лучше сначала задать, а затем отвечать.
4. Я проголосовал за другой ответ, поскольку он более гибкий, но я не вижу, чтобы ваши ожидания были явно правильными — вполне возможно, он просто указал, что исходная таблица содержит больше этих трех столбцов.
5. Хммм … разве когда-то не было кнопки удаления рядом с ответами?
Ответ №3:
Вот так:
CREATE TABLE #temp(ID int, Username varchar(50), ModifiedDate datetime)
INSERT INTO #temp(ID, Username, ModifiedDate)
VALUES
(1, 'A.BEENA', '2009-12-07 04:48:17.980'),
(2, 'A.BEENA', '2009-11-17 06:02:27.443'),
(3, 'Abhilash', '2009-12-07 04:48:17.980'),
(4, 'abhilash.r', '2009-12-07 04:48:17.980'),
(5, 'AJI', '2009-11-17 06:02:27.443'),
(6, 'haris', '2009-12-07 04:48:17.980'),
(7, 'haris', '2009-11-17 06:02:27.443')
SELECT t.Username, t.ModifiedDate
FROM #temp t
WHERE NOT EXISTS (SELECT 1 FROM #temp WHERE Username = t.Username AND ModifiedDate > t.ModifiedDate)