У меня есть две такие таблицы:
Table1 (Number column is unique)
Number | date
1234 2008-10-06 17:11:00
5678 2005-10-19 16:20:00
9023 2005-12-09 16:20:00
4243 2009-01-06 17:11:00
5234 2009-01-14 17:11:00
Table 2
Number | code
1234 A1
1234 B1
5678 A1
9023 A1
4243 C1
5234 C1
Я пытаюсь получить данные из этих двух таблиц, чтобы получить только одну строку для каждого кода в таблице 2, который является самым последним (из таблицы 1).
Исходя из этого примера, мой результат будет следующим:
1234 A1 (потому что это последняя дата)
1234 B1 (потому что это последняя дата)
5234 C1 (потому что это последняя дата)


Select Distinct T1.number, T2.code
From Table2 T2
Join Table1 T1
On T1.Number = T2.Number
And T1.date =
(Select Max(Date) From Table1
Where Number = T2.Number)
Обновлено: исправить проблему, указанную в комментарии:
Select Z.Number, Z.Code
From (Select A.number, A.code, B.date
From Table2 A Join Table1 B
On B.Number = A.Number) Z
Where Z.Date =
(Select Max(Date)
From Table2 A Join Table1 B
On B.Number = A.Number
Where code = Z.Code)
Дэйв, unknown не указал базу данных. Oracle не использую, никогда не сталкивался с аналитикой. Я проверю это на предмет PostgreSQL.
Дэйв, я не знаком с "Аналитикой" - ну, еще одна область, с которой нужно познакомиться! - и осталось так много пустых глиальных клеток, знаете ли ...
Это не работает. Это возвращает следующие результаты: 1234 A1 1234 B1 4243 C1 5234 C1 5678 A1 9023 A1 Это возвращает 5678 и 9023. которые не должны отображаться. потому что дата 1234 года самая поздняя ....
он отлично работает, если select изменен на выбор отдельного (t2.code), но проблема в том, чтобы получить номер. Если номер добавлен, то все будет получено!
Решение аналитической функции. Это для Oracle; если вы используете другую СУБД, она может не работать. Если для данного кода есть несколько строк с одинаковой датой, будет произвольно выбрана одна.
SELECT number, code FROM (
SELECT t1.number,
t1.code,
row_number() OVER ( PARTITION BY t1.code ORDER BY t2.date DESC ) date_sort_key
FROM t1, t2
WHERE t2.number = t1.number
)
WHERE date_sort_key = 1
Замена rank () на row_number () заставит его сообщать о нескольких записях с повторяющейся датой.
Это работает для SQL SERVER
CREATE table Table1 (number int, date datetime)
INSERT Table1 VALUES (1234, '2008-10-06 17:11:00')
,(5678, '2005-10-19 16:20:00')
,(9023, '2005-12-09 16:20:00')
,(4243, '2009-01-06 17:11:00')
,(5234, '2009-01-14 17:11:00')
CREATE table Table2 (number int, code varchar(2))
INSERT Table2 VALUES (1234, 'A1 ')
,(1234, 'B1')
,(5678, 'A1')
,(9023, 'A1')
,(4243, 'C1')
,(5234, 'C1')
SELECT DISTINCT
a.number
,a.code
FROM Table2 a
INNER JOIN Table1 b ON a.number = b.number
INNER JOIN (
SELECT
t2.code
,MAX(t1.date) as date
FROM Table2 t2
INNER JOIN Table1 t1
ON t1.Number = t2.Number
GROUP BY t2.code
) c ON b.date = c.date
Вот версия ответа Дэйва, которая работает на SQL Server
SELECT number, code FROM (
SELECT Table2.number,
Table2.code,
row_number() OVER ( PARTITION BY table2.code ORDER BY table1.date DESC ) date_sort_key
FROM table1, Table2
WHERE Table2.number = table1.number
) a
WHERE date_sort_key = 1
Это классический метод. Сейчас я предпочитаю использовать аналитику (см. Другой ответ). Вы должны проверить производительность и то, как они обрабатывают дубликаты, если это имеет значение, чтобы решить, какой из них лучше для вас.