SQL组和顺序

时间:2010-03-11 21:34:07

标签: sql grouping

我有多个用户,有多个条目记录他们到达目的地的时间

不知何故,使用我的select查询,我只想显示每个唯一用户名的最新条目。

以下代码不起作用:

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 个答案:

答案 0 :(得分:8)

这样的东西
Select xName, MAX(xDATETIME) AS MaxDateVal
FROM $dbtable
GROUP BY xName
ORDER BY MaxDateVal

答案 1 :(得分:3)

SELECT xNAME, MAX(xDATETIME)
FROM $dbTable 
GROUP BY xNAME 
ORDER BY xDATETIME DESC

答案 2 :(得分:2)

查询的问题在于,当您使用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即可。

答案 3 :(得分:0)

SELECT MAX(xNAME), MAX(xDATETIME) FROM $dbTable GROUP BY xNAME ORDER BY xDATETIME DESC

答案 4 :(得分:0)

你也可以这样做:

Select 
  xName, xDATETIME 
from 
  $dbTable t1
where 
  xDATETIME = 
    (select max(xDATETIME) from $dbTable t2
     where t1.xName=t2.xName)
order by xDATETIME DESC