SQL - 从一组结果中选择唯一的行

时间:2009-08-27 08:21:59

标签: sql

我已经在这个问题上破坏了我的大脑很长一段时间。我还审查了其他问题,但没有成功。

我遇到的问题是,我有一个结果列表/表格,其中有多列,列为
|注册| ID |日期| UNITTYPE

| 005DTHGP | 172 | 2007-09-11 |姆比奥
| 005DTHGP | 1966年| 2006-09-12 |跟踪
| 013DTHGP | 2281 | 2006-11-01 |跟踪
| 013DTHGP | 2712 | 2008-05-30 |姆比奥
| 017DTNGP | 2404 | 2006-10-20 |跟踪
| 017DTNGP | 508 | 2007-11-10 |姆比奥


我正在尝试选择具有唯一REGISTRATIONS的行以及DATE为max(最新)的行。 ID与DATE不成比例,这意味着ID可以是低值,但DATE高于其他匹配行,反之亦然。因此,我不能在DATE和ID上使用MAX(),并且分组似乎不起作用。

我想要的结果如下;

|注册| ID |日期| UNITTYPE

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

请帮助!!!?!?!?!?!?!?

5 个答案:

答案 0 :(得分:1)

您需要嵌入式查询,而不是所有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 

答案 1 :(得分:0)

这应该适用于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子句中使用正确的日期和注册来获取同一行的其他字段。

答案 2 :(得分:0)

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

如果您的表中有数千行,这取决于查询的执行方式(即,如果它是行扫描,然后是每行选择),则效率很低。

答案 3 :(得分:0)

在PostgreSQL中,并假设您的数据已编入索引以便不需要排序(或者您不介意排序的行数太少):

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

按照注册和降序日期顺序排列每一行,您将首先获得每次注册的最新日期。 DISTINCT会抛弃后面的重复注册。

答案 4 :(得分:0)

select registration,ID,date,unittype
from your_table
where (registration, date) IN (select registration,max(date)
                            from your_table
                            group by registration)