我已经在这个问题上破坏了我的大脑很长一段时间。我还审查了其他问题,但没有成功。
我遇到的问题是,我有一个结果列表/表格,其中有多列,列为
|注册| 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 |姆比奥
请帮助!!!?!?!?!?!?!?
答案 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)