此问题涉及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 *
答案 0 :(得分:3)
啊,好老greatest-n-per-group ......
这是一种方法:
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