2015-12-09 7 views
0

DB: Mysqlкак выбрать последние записи из таблицы

Я имею таблицу (tblSomething) со следующими записями:

enter image description here

Теперь мне нужно фильтровать это записи, выбрав последний уникальные записи из этой таблицы.

результат должен быть:

enter image description here

Во 2-изображения Джо и Рина с 11/16/2015 не доступен.

Можете ли вы рассказать мне, как написать запрос для достижения этого.

+0

MySQL или SQL-сервера? не могут быть обоим. – DarkKnight

+0

@DarkKnight Фактически, это может быть и то, и другое, если мы дадим чистый запрос ANSI-92 в качестве ответа. Но да, он должен правильно обозначить. –

+0

Почему записи «404 468 joe tina» появляются дважды в результирующем наборе? Если записи '11/16/2015' не будут отфильтрованы по запросу? –

ответ

2

Попробуйте следующий запрос:

SELECT t1.ID1, t1.ID2, t1.Name1, t1.Name2, t1.date 
FROM tblSomething t1 
INNER JOIN 
(
    SELECT ID1, ID2, MAX(date) AS date 
    FROM tblSomething 
    GROUP BY ID1, ID2 
) t2 
ON t1.ID1 = t2.ID1 AND t1.ID2 = t2.ID2 AND t1.date = t2.date 

Внутренний запрос определяет для каждого ID1/ID2 пары, самый последний момент. Затем запрос во всей таблице tlbSomething ограничивается сохранением только тех записей, которые имеют эту самую последнюю дату для каждой пары ID1/ID2.

Нажмите приведенную ниже ссылку для запуска демонстрационной версии, используя данные примера из OP.

SQLFiddle

+0

плюс один для простого решения и объяснения. – DarkKnight

+0

Хорошее решение, что, если у него больше полей, как вы справитесь с этим, см. Обновленный вопрос. – yogeshkmrsoni

+0

@yogeshkmrsoni Дайте скрипку попробовать. Результат соответствует тому, что вы показали нам в OP. –

0

Использование MAX или str_to_date

SELECT * 
FROM table t1 
WHERE str_to_date(t1.date,'%m/%d/%Y')=(SELECT MAX(str_to_date(t2.date,'%m/%d/%Y')) 
       FROM table t2 
       WHERE t1.ID2 = t2.ID2) 
0
CREATE TABLE #tblSomething 
(ID1 int, ID2 int, Name1 varchar(55), Name2 varchar(55), date1 date, cost int, days int, somefield int); 

INSERT INTO #tblSomething 
    (ID1, ID2, Name1, Name2, date1, cost, days, somefield) 
VALUES 
    (330, 435, 'sn1', 'hello1', '2015-11-17', 500, 12, 34), 
    (404, 467, 'joe', 'rina', '2015-11-23', 600, 23, 22), 
    (404, 467, 'joe', 'rina', '2015-11-16', 700, 11, 123), 
    (404, 468, 'joe', 'tina', '2015-11-23', 800, 23, 41), 
    (404, 468, 'joe', 'tina', '2015-11-16', 789, 11, 43); 

попробовать этот

with res as (select *,ROW_NUMBER() over(partition by ID1, ID2, Name1, Name2 order by ID1, ID2, Name1, Name2) as rn from #tblSomething) 
    select ID1, ID2, Name1, Name2, date1, cost, days, somefield from res where rn=1 

выход

enter image description here

Смежные вопросы