2009-08-27 12 views
1

私はかなりの時間この問題について私の脳を破壊しました。私は他の質問も見直しましたが、失敗しました。SQL - 結果のグループから一意の行を選択してください

私の問題は、列の複数の行を持つ結果/テーブルの一覧があります。

|登録| ID         | DATE                     |ユニットタイプ

| 005DTHGP               | 172     | 2007-09-11   | MBio
| 005DTHGP               | 1966年| 2006-09-12   |トラッカー
| 013DTHGP               | 2281 | |トラッカー
| 013DTHGP               | 2712 | 2008-05-30   | MBio
| 017DTNGP               | 2404 | |トラッカー
| 017DTNGP               | 508     | 2007-11-10   | MBio

私は一意のREGISTRATIONSで行を選択しようとしています。日付は最大(最新)です。 IDはDATEに比例しません。つまり、IDは低い値である可能性がありますが、DATEは他の一致する行よりも高く、逆も同様です。したがって、DATEとIDの両方でMAX()を使用することはできません。グループ分けは機能していないようです。

私が望む結果は以下のとおりです。

|登録| ID         | DATE                     |ユニットタイプ

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

ご協力ください!?!?!?!?!?!?!?!?!?

+0

どのプラットフォームですか? Tisは私たちが提供できるSQLとは異なります – gbn

+0

私はMS SQL 2005/2008を使用しています – Theo

答えて

1

すべてのSQLをサポートするわけではない埋め込みクエリが必要です。 T-SQLでは、PostgreSQLの

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のレコードを扱っています。このすべてが1行でできたらうれしいでしょう。ああ。ありがとう – Theo

+0

ビューは確かに高価かもしれません - 必要なデータのスナップショットをテンポラリテーブル/テーブル変数に取り込むことを検討してください。 – Unsliced

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句に正しい日付と登録を使用して、同じ行の他のフィールドを取得します。

+0

最大日付の行のIDを与えません。 –

+0

...およびID + UnitType列? – gbn

+0

編集しました.. –

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

のようなものを持っているし、あなたのデータはソートが必要とされないようにインデックス化(または並べ替えを気にしないので、いくつかの行がある)されたと仮定すると思います。

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)  
関連する問題