SQL - выберите уникальные строки из группы результатов - PullRequest
1 голос
/ 27 августа 2009

Я уже давно разбил мозг этой проблемой. Я также рассмотрел другие вопросы, но безуспешно.

У меня проблема в том, что у меня есть список результатов / таблицы, которая состоит из нескольких строк со столбцами

| РЕГИСТРАЦИЯ | ID | ДАТА | UNITTYPE

| 005DTHGP | 172 | 2007-09-11 | MBio
| 005DTHGP | 1966 | 2006-09-12 | Tracker
| 013DTHGP | 2281 | 2006-11-01 | Tracker
| 013DTHGP | 2712 | 2008-05-30 | MBio
| 017DTNGP | 2404 | 2006-10-20 | Tracker
| 017DTNGP | 508 | 2007-11-10 | MBio


Я пытаюсь выбрать строки с уникальными РЕГИСТРАЦИЯМИ и где ДАТА максимальная (самая последняя). Идентификаторы не пропорциональны DATE, что означает, что идентификатор может быть низким значением, но DATE выше, чем в другой соответствующей строке, и наоборот. Поэтому я не могу использовать MAX () как для DATE, так и для ID, а группировка просто не работает.

Я хочу получить следующие результаты;

| РЕГИСТРАЦИЯ | ID | ДАТА | UNITTYPE

| 005DTHGP | 172 | 2007-09-11 | MBio
| 013DTHGP | 2712 | 2008-05-30 | MBio
| 017DTNGP | 508 | 2007-11-10 | MBio

ПОЖАЛУЙСТА, ПОМОГИТЕ !!!?!?!?!?!?!?

Ответы [ 5 ]

1 голос
/ 27 августа 2009

Вы хотите встроенные запросы, которые поддерживаются не всеми SQL. В t-sql у вас будет что-то вроде

select  r.registration, r.recent, t.id, t.unittype
from    ( 
    select  registration, max([date]) recent
    from    @tmp 
    group by 
        registration
    ) r
left outer join 
    @tmp t 
on  r.recent = t.[date]
and r.registration = t.registration 
0 голосов
/ 27 августа 2009
select registration,ID,date,unittype
from your_table
where (registration, date) IN (select registration,max(date)
                            from your_table
                            group by registration)    
0 голосов
/ 27 августа 2009

В PostgreSQL и при условии, что ваши данные проиндексированы так, что сортировка не нужна (или строк так мало, что вы не против сортировки):

select distinct on (registration), * from whatever order by registration,"date" desc;

Принимая каждую строку в порядке регистрации и по убыванию, вы сначала получите самую последнюю дату для каждой регистрации. DISTINCT выбрасывает повторяющиеся регистрации, которые следуют.

0 голосов
/ 27 августа 2009

TSQL:

declare @R table
(
Registration varchar(16),
ID int,
Date datetime,
UnitType varchar(16)
)

insert into @R values ('A','1','20090824','A')
insert into @R values ('A','2','20090825','B')

select R.Registration,R.ID,R.UnitType,R.Date from @R R
inner join
(select Registration,Max(Date) as Date from @R group by Registration) M
on R.Registration = M.Registration and R.Date = M.Date

Это может быть неэффективно, если в вашей таблице тысячи строк, в зависимости от того, как выполняется запрос (то есть, если это сканирование строк, а затем выборка на строку).

0 голосов
/ 27 августа 2009

Это должно работать в MySQL:

SELECT registration, id, date, unittype FROM 
  (SELECT registration AS temp_reg, MAX(date) as temp_date 
  FROM table_name GROUP BY registration) AS temp_table
WHERE registration=temp_reg and date=temp_date

Идея состоит в том, чтобы использовать подзапрос в предложении FROM, который выбрасывает одну строку, содержащую правильную дату и регистрацию (поля, принадлежащие группе); затем используйте правильную дату и регистрацию в предложении WHERE для извлечения других полей той же строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...