2012-05-09 2 views
2

Может ли кто-нибудь помочь мне узнать, как построить sql-запрос для следующей таблицы, чтобы получить отдельные строки (на основе имени и даты) с последней датой.Sql отдельная группа по строкам

Date    Name  Score 

2011-06-16 10:30 Johan 36  
2010-12-09 08:52 Thomas 32 
2012-04-25 15:14 Jak  56 
2008-09-07 11:57 Jak  64 
2012-02-28 13:22 Jan  23 
2011-01-11 12:08 Thomas 22  
2008-10-06 12:22 Kane  54 

В результате, запрос будет показывать строки 1, 3, 6, 7.

+1

Возможный дубликат [SQL - выбор уникальных строк из группы результатов] (http://stackoverflow.com/questions/1339624/sql-select-unique-rows-from-a-group-of-results) –

ответ

1

Вы можете использовать следующее:

select date, name, score 
from temp t1 
where date = (select max(date) from temp where t1.name = temp.name) 

увидеть sql fiddle с демо.

+0

+1 для скрипки :) – mrd

1

Если предположить, что RDMS не поддерживает оконные функции,

SELECT a.* 
FROM table1 a 
INNER JOIN 
(
    SELECT name,MAX(date) as max_date -- date field may need escaping 
    FROM table1 a 
    GROUP BY name 
)b ON (b.name = a.name AND a.date=b.max_date) 

Update

Dems комментарий, если дата + имя не уникально, но вы хотите увидеть имя только один раз,

SELECT c.name,c.date, MAX(c.score) as max_score 
FROM 
(
SELECT a.* 
FROM table1 a 
INNER JOIN 
(
    SELECT name,MAX(date) as max_date -- date field may need escaping 
    FROM table1 a 
    GROUP BY name 
)b ON (b.name = a.name AND a.date=b.max_date) 
)c 
+1

+1: Обратите внимание, однако, что это * предполагает *, что для каждого имени поле даты уникально. – MatBailie

+0

@ Dems: Я согласен, но я считаю, что это вполне законное предположение в этом случае (имя + дата уникально) – a1ex07

1

Что-то, как это должно работать ...

SELECT date, name, score 
FROM table a 
WHERE date = (
    SELECT MAX(date) 
    FROM table b 
    WHERE a.name = b.name 
) 
+1

+1: Обратите внимание, что это * предполагает *, что для каждого имени поле даты уникально. – MatBailie

-1
select convert(varchar,date,103) as name_date, name from table1 where convert(varchar, date, 103) = (select convert(varchar,max(date),103) as n_date from table1) 

это когда время не рассматривается в MSSQL базы данных формата SQL

+0

-1: Преобразование в строки для манипуляции DATETIME всегда будет получать от меня -1. Сожалею. – MatBailie

+1

грустно, что мой ответ пришел к ur perview – ray

2

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

SELECT date, name, score 
FROM (select *, 
      row_number() over (partition by name order by date desc) as seqnum 
     from table a 
    ) a 
WHERE seqnum = 1 

Это перечисление строк, начиная с последней даты, отсчитывающей назад. Затем он выбирает одну из дат.

+0

+1: Предполагая, что диалект SQL-запросов OPs поддерживает row_number. – MatBailie

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