2009-08-27 90 views
1

我已經在這個問題上破壞了我的大腦很長一段時間。我也回顧了其他問題,但沒有成功。SQL - 從一組結果中選擇唯一行

我現在的問題是,我有一個結果列表/列表,有多行的列表

|註冊| ID         | DATE                       | UNITTYPE

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


我想選擇具有唯一註冊表的行和日期是最大(最新)的行。這些ID與DATE不成比例,這意味着ID可能較低,但DATE高於其他匹配的行,反之亦然。因此,我不能在日期和ID上使用MAX(),並且分組似乎不起作用。

我想要的結果如下;

|註冊| ID         | DATE                       | UNITTYPE

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

請幫助!!!?!???????!?

+0

什麼平臺? TIS使我們可以提供什麼SQL不同 – gbn 2009-08-27 08:25:21

+0

我正在使用MS SQL 2005/2008 – Theo 2009-08-27 17:21:04

回答

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

謝謝。這是我發佈我的問題之前採取的路線。只是存在性能問題,因爲我正在使用的數據是通過視圖生成的,而且我認爲這種方法實際上會創建另一個源/視圖。我正在處理有關9000條記錄的事情。如果所有這些都可以在一行中完成,那本來是很好的。唉。謝謝 – Theo 2009-08-27 16:50:22

+0

視圖當然可能是昂貴的 - 考慮也許將所需數據快照到臨時表/表變量? – Unsliced 2009-08-28 08:13:29

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 

的想法是在使用一個子查詢從中拋出了包含正確的日期和註冊(字段進行的基團)的單排條款;然後在WHERE子句中使用正確的日期和註冊來獲取同一行的其他字段。

+0

它不會給你一個具有最大日期的行的ID。 – 2009-08-27 08:28:25

+0

...和ID + UnitType列? – gbn 2009-08-27 08:28:33

+0

編輯.. – 2009-08-27 08:30:32

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 

這可能是低效的,如果你依賴於如何執行查詢有幾千行的表格(即,如果它是一個rowscan,然後每行一個選擇)。

0

在PostgreSQL,並假設你的數據進行索引,從而不需要排序(或有這麼幾行,你不介意排序):

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

以註冊和降序日期排序的每一行,您將首先獲得每個註冊的最新日期。 DISTINCT拋棄後續的重複註冊。

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