извлечение строк с максимальной датой - PullRequest
2 голосов
/ 16 января 2009

У меня есть две таблицы, подобные этой:

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 А1 (потому что тот с самой поздней датой)

1234 B1 (потому что это тот, с последней датой)

5234 C1 (потому что это тот, с последней датой)

Ответы [ 4 ]

3 голосов
/ 16 января 2009
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)
1 голос
/ 16 января 2009

Вот вариант ответа Дейва, который работает на 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
1 голос
/ 16 января 2009

Решение аналитической функции. Это для 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 () заставит его сообщить о нескольких записях, где есть повторяющаяся дата.

0 голосов
/ 16 января 2009

Это работает для 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...