Получение строк с максимальной датой

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

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 (потому что это последняя дата)

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
0
702
4

Ответы 4

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)

Это классический метод. Сейчас я предпочитаю использовать аналитику (см. Другой ответ). Вы должны проверить производительность и то, как они обрабатывают дубликаты, если это имеет значение, чтобы решить, какой из них лучше для вас.

Dave Costa 16.01.2009 00:22

Дэйв, unknown не указал базу данных. Oracle не использую, никогда не сталкивался с аналитикой. Я проверю это на предмет PostgreSQL.

WolfmanDragon 16.01.2009 00:45

Дэйв, я не знаком с "Аналитикой" - ну, еще одна область, с которой нужно познакомиться! - и осталось так много пустых глиальных клеток, знаете ли ...

Charles Bretana 16.01.2009 01:14

Это не работает. Это возвращает следующие результаты: 1234 A1 1234 B1 4243 C1 5234 C1 5678 A1 9023 A1 Это возвращает 5678 и 9023. которые не должны отображаться. потому что дата 1234 года самая поздняя ....

user41685 16.01.2009 01:24

он отлично работает, если select изменен на выбор отдельного (t2.code), но проблема в том, чтобы получить номер. Если номер добавлен, то все будет получено!

user41685 16.01.2009 01:31

Решение аналитической функции. Это для 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

Другие вопросы по теме