Лучшие 1 отдельные строки из таблицы

#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)