SQL查询-使用多个表分组

SQL查询-使用多个表分组,sql,greatest-n-per-group,Sql,Greatest N Per Group,此问题涉及两个表格: 表1: |- Time Stamp -|- Special Number -|- Other Data -| |- 2011 -|- 1 -|- green -| |- 2010 -|- 1 -|- blue -| |- 2009 -|- 2 -|- yellow -| |- 2011 -|- 3

此问题涉及两个表格:

表1:

|- Time Stamp -|- Special Number -|- Other Data -|
|- 2011       -|- 1              -|- green      -|
|- 2010       -|- 1              -|- blue       -|
|- 2009       -|- 2              -|- yellow     -|
|- 2011       -|- 3              -|- red        -|
|- 2010       -|- 3              -|- orange     -|
|- 2009       -|- 4              -|- purple     -|
表2:

|- Special Number -|- State (location) -|
|- 1              -|- Hawaii           -|
|- 2              -|- Hawaii           -|
|- 3              -|- Alaska           -|
|- 4              -|- Alaska           -|
表2将“特殊编号”与“状态”关联起来

现在,我试图得到的结果如下:

|- Time Stamp -|- State (location) -|- Other Data -|
|- 2011       -|- Hawaii           -|- green      -|
|- 2011       -|- Alaska           -|- red        -|
其中,我试图获得最大时间戳(按每个状态分组),以及与表1中“最新时间戳”行对应的其他数据

如果我这样做:

SELECT MAX(time stamp), state
FROM table 1, table 2
WHERE table 1.special number = table 2.special number
GROUP BY state
这将返回每个状态的最大时间戳(这几乎就是我要查找的),但当我尝试包含“其他数据”时,它将返回所有记录(因为每个“其他数据”记录都是唯一的)

我希望有人能提供一些想法, 谢谢

编辑:

表1有一个唯一的ID列:

|- Time Stamp -|- Special Number -|- Other Data -|- Unique Row ID -|
|- 2011       -|- 1              -|- green      -| 0              -|
|- 2010       -|- 1              -|- blue       -| 1              -|
|- 2009       -|- 2              -|- yellow     -| 2              -|
|- 2011       -|- 3              -|- red        -| 3              -|
|- 2010       -|- 3              -|- orange     -| 4              -|
|- 2009       -|- 4              -|- purple     -| 5              -|
编辑2:解决方案****感谢所有发布的人!****

 SELECT t1.timestamp, t2.specialNumber, t1.otherData
 FROM Table1 t1 inner join Table2 t2 on t1.specialNumber = t2.specialNumber
     inner join (select MAX(Table1.timestamp) maxts, Table2.state
         from Table1 inner join Table2 on Table1.specialNumber = Table2.specialNumber
         group by Table2.state) t3
     on t2.state = t3.state and t1.timestamp = t3.maxts
*呼*

啊,好老

这里有一种方法:

SELECT t1.TimeStamp, t2.State, t1.OtherData
FROM Table1 t1
inner join Table2 t2 
    on t1.SpecialNumber = t2.SpecialNumber
inner join (SELECT MAX(time stamp) maxts, state
            FROM table1 inner join table2
            ON table1.specialnumber = table2.specialnumber
            GROUP BY state) t3
    on t2.State = t3.State and t1.TimeStamp = t3.maxts

这里有一个非常全面的答案:

您可以将查询变成一个子查询(在我的版本中称为states),然后再次将其连接回表1,并获取额外的列,如下所示:

SELECT * FROM

(SELECT MAX(time stamp), state
FROM table 1, table 2
WHERE table 1.special number = table 2.special number
GROUP BY state) states

LEFT JOIN table1 t1_again
ON states.specialNumber = t1_again.specialNumber

您是否有一个id列来唯一标识表1中的一行?在此处搜索“sql latest row”,您应该能够找到几种方法。如果您有一个id列来唯一标识表1中的一行,我将发布一个编辑过的表1BTW,什么是数据库引擎?您在派生表中错过了别名maxts。@Kash是的,我错过了。谢谢你提醒,已经修好了!谢谢,这已经足够让我找到解决方案了!我很快就会发布。@Adrian:在这种情况下,有没有办法用你的第二种方法(左键与self连接,调整连接条件和过滤器)进行2次智能移动。与之斗争(只是好奇)。@Kash是的。我将给你一个提示:在综合答案的示例中,你将一个表与其自身连接起来。在这种情况下,您必须将
Table1连接到Table2
本身(这意味着您将连接)。如果DB支持CTEs,则可以使用更少的代码和更清晰的方式完成。别忘了把答案投在那边!除了Adrian对specialNumber的评论外,该代码在表名和列名方面也不一致。MAX函数的列没有别名。我的文章不是作为文字代码,而是作为如何解决此问题的示例。很明显,像“special number”这样的列名不会真正起作用,但感谢您指出显而易见的问题。