Как я могу группировать и заказывать с sql одновременно? - PullRequest
1 голос
/ 31 мая 2011

У меня есть следующая таблица sqlite3:

Name | LastUpdated | Status
============================
Adam | 2011-05-28  | 1
Bob  | 2011-05-05  | 6
Adam | 2011-05-27  | 2
Adam | 2011-05-16  | 1
Adam | 2011-05-26  | 3
Bob  | 2011-05-18  | 1
Adam | 2011-05-29  | 6

, и я хочу выбрать строку для имени, упорядоченную по столбцу LastUpdated.Поэтому я хочу получить эти данные:

Adam | 2011-05-29  | 6
Bob  | 2011-05-18  | 1

Я думаю, что мне нужно сделать подзапрос, но я не могу понять, как это сделать.

Ответы [ 3 ]

3 голосов
/ 31 мая 2011

Поддержка SQLite (и MySQL):

  SELECT t.name, 
         MAX(t.lastupdated), 
         t.status 
    FROM [table] t 
GROUP BY t.name

Но для большинства других баз данных вам потребуется:

SELECT a.name, a.lastupdate, a.status
  FROM YOUR_TABLE a
  JOIN (SELECT t.name, MAX(t.lastupdated) AS max_lastupdated
          FROM YOUR_TABLE t
      GROUP BY t.name) b ON b.name = a.name
                        AND b.max_lastupdated = a.lastupdated

... хотя это вернет дубликаты, если имя имеет более одной записи с одинаковым самым высоким значением даты.

1 голос
/ 31 мая 2011

Вы можете сделать это как самостоятельное соединение.В этом случае я назвал таблицу «таблицей», подставив свое собственное имя таблицы в:

SELECT
  test.Name,
  test.LastUpdated,
  test.Status
FROM
  test INNER JOIN 
    ( SELECT
        Name,
        MAX(LastUpdated) AS LatestUpdated
      FROM
        test
      GROUP BY
        Name ) AS latest
    ON test.Name = latest.name AND test.LastUpdated = latest.LatestUpdated;

Надеюсь, это поможет!

0 голосов
/ 31 мая 2011

SELECT 
       t.Name, 
       (Select LastUpdated from [table] t1 where t.name = t1.name order by lastUpdated desc LIMIT 1) as LastUpdated, 
       (Select Status from [table] where t1.name = t.name order by lastUpdated desc LIMIT 1) as Status
FROM [table] t
GROUP by Name

...