SQL группа и порядок - PullRequest
       13

SQL группа и порядок

3 голосов
/ 12 марта 2010

У меня есть несколько пользователей с несколькими записями, время записи которых они достигают пунктов назначения

Так или иначе, с моим запросом выбора я хотел бы показывать только самые последние записи для каждого уникального имени пользователя.

Вот код, который не работает:

SELECT * FROM $dbTable GROUP BY xNAME ORDER BY xDATETIME DESC

Это хорошо группирует имена, но, поскольку показывает ТОЛЬКО их самую последнюю запись, просто показывает первую запись, которую видит в таблице SQL.

Наверное, мой вопрос: возможно ли это?

Вот мой пример данных:

john  7:00
chris 7:30
greg 8:00
john 8:15
greg 8:30
chris 9:00

и мой желаемый результат должен быть только

john 8:15
chris 9:00
greg 8:30

Ответы [ 5 ]

8 голосов
/ 12 марта 2010

Как насчет чего-то вроде

Select xName, MAX(xDATETIME) AS MaxDateVal
FROM $dbtable
GROUP BY xName
ORDER BY MaxDateVal
3 голосов
/ 12 марта 2010
SELECT xNAME, MAX(xDATETIME)
FROM $dbTable 
GROUP BY xNAME 
ORDER BY xDATETIME DESC
2 голосов
/ 12 марта 2010

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

Вместо этого вы можете попробовать следующее:

SELECT     u.*
FROM       users u
INNER JOIN (
           SELECT   xName, MAX(xDatetime) max_time 
           FROM     users 
           GROUP BY xName
           ) sub_u ON (sub_u.xName = u.xName AND 
                       u.xDateTime = sub_u.max_time);

Приведенный выше запрос можно проверить следующим образом:

CREATE TABLE users (id int, xName varchar(100), xDateTime datetime);

INSERT INTO users VALUES (1, 'a', '2010-03-11 00:00:00');
INSERT INTO users VALUES (2, 'a', '2010-03-11 01:00:00');
INSERT INTO users VALUES (3, 'a', '2010-03-11 02:00:00');
INSERT INTO users VALUES (4, 'b', '2010-03-11 01:00:00');
INSERT INTO users VALUES (5, 'b', '2010-03-11 02:00:00');
INSERT INTO users VALUES (6, 'b', '2010-03-11 03:00:00');
INSERT INTO users VALUES (7, 'c', '2010-03-11 06:00:00');
INSERT INTO users VALUES (8, 'c', '2010-03-11 05:00:00');

-- Query Result:

+----+-------+---------------------+
| id | xName | xDateTime           |
+----+-------+---------------------+
|  3 | a     | 2010-03-11 02:00:00 |
|  6 | b     | 2010-03-11 03:00:00 |
|  7 | c     | 2010-03-11 06:00:00 | 
+----+-------+---------------------+

Если вы хотите упорядочить набор результатов по полю max_time, просто добавьте ORDER BY u.xDateTime DESC в конце запроса.

0 голосов
/ 12 марта 2010

Также вы можете сделать это:

Select 
  xName, xDATETIME 
from 
  $dbTable t1
where 
  xDATETIME = 
    (select max(xDATETIME) from $dbTable t2
     where t1.xName=t2.xName)
order by xDATETIME DESC
0 голосов
/ 12 марта 2010
SELECT MAX(xNAME), MAX(xDATETIME) FROM $dbTable GROUP BY xNAME ORDER BY xDATETIME DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...