2012-03-16 5 views
1

複数の値に基づいて群から選択行:SQL - 私のようなテーブル有する

| ID | Val | 
+-------+-----+ 
| abc-1 | 10 | 
| abc-2 | 30 | 
| cde-1 | 10 | 
| cde-2 | 10 | 
| efg-1 | 20 | 
| efg-2 | 11 | 

およびストリング(ID、1、3)最小値に基づいて結果を取得したいと思いとISTは、ヴァルが重複

| ID | Val | 
+-------+-----+ 
| abc-1 | 10 | 
| cde-1 | 10 | 
| efg-2 | 11 | 

を有する場合には、私はグループを使用することができないため、問題は、私は立ち往生だということであるのみ最初でなければなりません(ID、1,3)サブストリングによって、IDそれは、あなたが(両方のサブストリングを使用して列をグループ化し、再び2行(ABC-1、ABC-2のそれぞれ)

+0

U缶基(ID、1,3)の代わりに、サブストリング(ID、1,3)、IDをサブストリングによって。それは動作します... – Teja

答えて

9
WITH 
    sorted 
AS 
(
    SELECT 
    *, 
    ROW_NUMBER() OVER (PARTITION BY substring(id,1,3) ORDER BY val, id) AS sequence_id 
    FROM 
    yourTable 
) 
SELECT 
    * 
FROM 
    sorted 
WHERE 
    sequence_id = 1 
+0

+1私はあなたが私にそれを殴ったのを見たときに私はちょうど答えを書いていた。非常に素晴らしい! –

+0

@RRZEurope - これは、最初の3文字が 'id'フィールドにあるすべてのレコードをまとめてグループ化することです。最下位の「val」が最初に来るように注文し、最下位の「id」が最初に来るようにします。次に、外部クエリは各グループから最初のレコードを選択します。 **実際の***の 'id'値はどのように見えるのですか? '-'の前に3文字以上の文字を入れることはできますか?もしそうなら、 'SUBSTRING(id、1,3)'はデータのふるまいに合わせて変更する必要があります。 – MatBailie

+0

Thx - 素晴らしい:-) –

0
SELECT SUBSTRING(id,1,3),MIN(val) FROM Table1 GROUP BY SUBSTRING(id,1,3); 

を有するのでid、1,3)、単にSUBSTRING(id、1,3)ではなくidを指定します。これは完璧に動作します。以下のリンクで同じ例を確認してください。

http://sqlfiddle.com/#!3/fd9fc/1

+0

OPは、部分文字列()だけでなく、結果に*** ***の 'id'を必要とすることを除いて。そして、 'id'は' MIN(val) 'に対応するものでなければなりません。 – MatBailie

関連する問題