Как написать это заявление SQL - PullRequest
1 голос
/ 01 апреля 2009

таблица1 имеет 3 столбца:

Id UserName SubmittedDate
1 Джо 1/1/2006
2 Джо 1/1/2007
3 Nat 1/1/2008
4 Пэт 01.01.2009

Я хочу вернуть это:

Id UserName
2 Джо
3 Nat
4 пат

Мне нужна только одна запись для Джо, самая последняя.

Как мне написать этот запрос? Спасибо

Ответы [ 5 ]

4 голосов
/ 01 апреля 2009
SELECT  Id, UserName, SubmittedDate
FROM    (
        SELECT  Id, UserName, SubmittedDate,
                ROW_NUMBER() OVER (PARTITION BY UserName ORDER BY SubmittedDate DESC) rn
        FROM    table1
        ) q
WHERE rn = 1
3 голосов
/ 01 апреля 2009
SELECT MAX(ID), UserName
FROM table
GROUP BY UserName

Обратите внимание, что предполагается, что более высокий идентификатор означает позже. Он не запрашивает непосредственно в поле «Дата отправки». Для этого воспользуйтесь гораздо более сложным из Quassnoi:)

1 голос
/ 01 апреля 2009

Вот три возможных решения. Дайте каждому попробовать и посмотреть, что лучше для ваших данных и ситуации. Помните, что в ситуациях, когда имя пользователя имеет два одинаковых значения submit_date, результаты могут отличаться от ожидаемых.

SELECT
    T1.id,
    T1.username
FROM
    My_Table T1
INNER JOIN 
  (
   SELECT username, MAX(submitted_date) 
   FROM My_Table T2 GROUP BY username
  ) SQ 
    ON SQ.username = T1.username AND SQ.submitted_date = T1.submitted_date

.

SELECT
    T1.id,
    T1.username
FROM
    My_Table T1
WHERE
    NOT EXISTS 
    (
      SELECT * 
      FROM
         My_Table T2 
      WHERE
         T2.username = T1.username AND
         T2.submitted_date > T1.submitted_date
    )

.

SELECT
    T1.id,
    T1.username
FROM
    My_Table T1
LEFT OUTER JOIN My_Table T2 ON
    T2.username = T1.username AND
    T2.submitted_date > T1.submitted_date
WHERE
    T2.id IS NULL
1 голос
/ 01 апреля 2009

Только со стандартным SQL:

SELECT Id, UserName
FROM table1
JOIN (
    SELECT UserName, MAX(SubmittedDate) AS MaxDate
    FROM table1
    GROUP BY UserName
    ) AS MaxDateTable ON table1.UserName = MaxDateTable.UserName
WHERE SubmittedDate = MaxDate
0 голосов
/ 01 апреля 2009

Срывая @Quassnoi, но мне нравится пропагандировать использование CTE вместо подзапросов и большинства представлений.

WITH
query1 as(
    SELECT  Id, UserName, SubmittedDate,
            ROW_NUMBER() OVER (PARTITION BY UserName ORDER BY SubmittedDate DESC) rn
    FROM    table1
        )

SELECT  Id, UserName, SubmittedDate
FROM   query1
WHERE rn = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...