SQL-запрос - группировка по нескольким таблицам - PullRequest
2 голосов
/ 17 ноября 2011

В этом вопросе участвуют 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 связывает «Специальный номер» сa 'State'

Теперь результат, который я пытаюсь получить, будет выглядеть примерно так:

|- 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 имеет столбец уникальный идентификатор:

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

* вот так *

Ответы [ 2 ]

3 голосов
/ 17 ноября 2011

Аааа, старый добрый ...

Вот один из способов сделать это:

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 Выберите только столбцы с максимальным значением в столбце

0 голосов
/ 17 ноября 2011

Вы можете превратить ваш запрос в подзапрос (называемый состояниями в моей версии), а затем снова присоединить его к 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
...