2011-05-31 109 views
1

我有以下sqlite3的表:如何在同一时间使用sql进行分组和排序?

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列排序名称一行。所以我想得到这个数据:我想我必须做一个子查询,但我不知道如何去解决这个问题。

+0

没有意义 - 你想要的bob记录有最早的日期;亚当的是最新的... – 2011-05-31 02:54:36

+0

我只是想通了。 SELECT Name,MAX(LastUpdated),Status FROM [table] GROUP BY名称 – Rudacles 2011-05-31 03:00:54

+0

这样做,您将获得一个任意状态字段,而不是与MAX(LastUpdated)列对应的字段 - 如果这是您想要的。在你的例子中,你显示'状态'字段'鲍勃'为'1',这是最新更新日期的状态字段... – 2011-05-31 03:14:17

回答

0
 

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 
 
+0

没有关联,所以将返回最新状态和最后更新的所有记录。为什么你会使用子选择而不是MAX,我不知道... – 2011-05-31 03:03:20

+0

杜...编辑它。我本来可以使用MAX以及......第一本能似乎是被再次选择:/ – 2011-05-31 03:06:46

3

的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

如果他们有不同的地位,但是相同的日期?此外,你不聚合的状态 - 不会抛出一个错误?我认为这个要求是只对名称进行分组,并根据日期选择最新的一切(或者我理解它)。 – 2011-05-31 03:07:11

+0

@MR:SQLite(和MySQL)选择一个任意的行 - http:// www .sqlite.org/lang_select.html#resultset - 用于不包含聚合函数或组的依据。它实际上是ANSI标准的一部分。 – 2011-05-31 03:09:23

+0

但你不想那样,对吧?根据lastUpdatedDate字段,是否也需要选择最新的“状态”?因为对于有'鲍勃'的行,他已经显示了具有最新日期的状态字段... – 2011-05-31 03:10:21

1

您可以将其作为自联接。在这种情况下,我已经叫表“表”,在替换为自己的表名:

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; 

希望这有助于!