SQL查询 - 使用多个表进行分组

时间:2011-11-17 16:12:25

标签: sql greatest-n-per-group

此问题涉及2个表:

表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        -|

我试图获取MAX时间戳,按每个状态分组,以及与表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

* whew *

2 个答案:

答案 0 :(得分:3)

啊,好老 ......

这是一种方法:

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

这里有一个非常全面的答案:SQL Select only rows with Max Value on a Column

答案 1 :(得分:0)

您可以将查询转换为子查询(在我的版本中称为状态),然后再将其连接回table1并抓取额外的列,如下所示:

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