SQL-запрос для получения только последнего значения по дате - PullRequest
0 голосов
/ 04 апреля 2011

У меня есть следующие две таблицы:

Таблица1 {T1ID, Имя}

Таблица2 {T2ID, T1ID, Дата, Значение}

Дата имеет тип DATE.

и я ищу SQL-запрос для получения только самого последнего значения (по дате) для каждого T1ID, для которого имя соответствует определенной строке.

SELECT`Table2`.`T1ID`,
    `Table2`.`Value`,
    `Table2`.`Date`, 
    `Table1`.`Name`,
    FROM `Table1` 
    INNER JOIN `Table2` ON `Table2`.`T1ID` = `Table1`.`T1ID`
    WHERE `Table1`.`Name` LIKE 'Smith'

но это возвращает значение для нескольких дат для одного и того же T1ID.

Как получить только последнее значение по дате?


Редактировать: я использую MySQL 5.5.8

Ответы [ 3 ]

1 голос
/ 04 апреля 2011

Если я правильно понял вопрос: Предполагая MySQL:

SELECT`Table2`.`T1ID`,
`Table2`.`Value`,
`Table2`.`Date`, 
`Table1`.`Name`
FROM `Table1` 
INNER JOIN `Table2` ON `Table2`.`T1ID` = `Table1`.`ID`,
(SELECT T1ID, MAX(Date) AS 'Date' FROM Table2 GROUP BY T1ID) Table3
WHERE 
`Table3`.`T1ID` = `Table2`.`T1ID`
AND
`Table3`.`Date` = `Table2`.`Date`
AND
`Table1`.`Name` LIKE 'Smith'

РЕДАКТИРОВАТЬ: Обновлен код, чтобы вернуть правильный набор результатов. Удален ответ MSSQL, так как он не актуален

1 голос
/ 05 апреля 2011

У вас есть два варианта.

select t1.t1id, max(t1.Name) Name, max(t2.date) Date, 
(select Value from table2 t22 
 where t22.date = max(t2.date) and t22.t1id = t2.t1id) Value
from table1 t1 left join table2 t2 on t1.t1id = t2.t1id
where Name like '%Smith%'
group by t2.t1id order by 2

ИЛИ

select mx.t1id, mx.Name, mx.Date, t2.Value
from 
(
select t1.t1id, max(t1.Name) Name, max(t2.date) Date
from table1 t1 left join table2 t2 on t1.t1id = t2.t1id
where Name like '%Smith%'
group by t2.t1id
) mx left join table2 t2 on (t2.t1id = mx.t1id and t2.date = mx.date)
order by 2

Оба будут давать один и тот же результат.Первый занимает меньше кода, но у вас могут быть проблемы с производительностью с огромным набором данных.Второй требует немного больше кода, но он также немного более оптимизирован.Примечания к параметру JOIN :

  • Если вы перейдете влево (как показано в примере), элементы в Таблице 1 без соответствующих записей в Таблице 2 будут отображаться в результате, но значения в столбцах «Дата и значение» будут равны NULL
  • Если вы нажмете INNER JOIN, элементы в таблице 1 без соответствующих записей в таблице 2 не будут отображаться .

РЕДАКТИРОВАТЬ

Я пропустил одно из требований: имя соответствовало определенной строке.Код теперь обновлен.«%» Действует как подстановочный знак, поэтому он будет соответствовать таким именам, как «Уилл Смит» и «Wail Smithers».Если вы хотите точное совпадение, удалите символы подстановки ('%').

0 голосов
/ 04 апреля 2011

Добавьте это к вашему SQL:

ORDER BY 'Date' DESC LIMIT 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...