2011-11-17 53 views
2

有参与这一问题2个表:SQL查询 - 具有多个表的分组

表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 

*咻*

+0

您是否有ID列来唯一标识表1中的行? – geekchic

+0

在这里搜索“sql latest row”,你应该可以找到几种方法 –

+0

我有一个ID列来唯一标识表1中的一行,我将发布一个编辑后的表格1 – SimpleSam5

回答

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

+0

您错过了派生表中的别名maxts。 – Kash

+0

@Kash是的,我做到了。感谢您的支持,它已经修复! –

+0

谢谢,这足够接近我的解决方案!我会尽快发布。 – SimpleSam5

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

在派生表“州”中没有'specialNumber' ... –

+0

除了Adrian对specialNumber的评论,此代码在表名和列名中不一致。 MAX函数的列没有别名。 – Kash

+0

我的文章不是作为文字代码,而是作为你如何解决这个问题的例子。很明显,像“特殊号码”这样的列名称并不真正起作用,但是要感谢您指出了这些显而易见的内容。 – pseudopeach