2

この質問は複雑なので、例が最適です...SQLサーバー管理ではなく、ODBCに関する次の表があります

NAME     SEQNUM     

JOHN     2          
JOHN     4
JOHN     7
MARY     12
MIKE     4
MIKE     9
PETER    7
PETER    12

そこで、seqNumが最も小さい名前を1つ引き戻したい...

NAME     SEQNUM
JOHN     2
MARY     12
MIKE     4
PETER    7

このデータは では機能しませんSELECT (MIN(SEQNUM))。それは数値を返します。実際のデータをデータセットに入れたい。誰もそれを行う方法を知っていますか?

4

6 に答える 6

14
select Name, MIN(SEQNUM)
from TABLE
Group By Name
于 2009-01-29T16:08:19.753 に答える
3

これがあなたが望むものだと思います:

select NAME, min(SEQNUM) as SEQNUM
from TABLE
group by NAME
于 2009-01-29T16:45:35.060 に答える
2
SELECT TOP 1 Name, SeqNum FROM yourtable ORDER BY SeqNum DESC

SeqNum が最も高いものを表示します

于 2009-01-29T16:06:27.963 に答える
1

Ian と Bill の回答をまとめることで、完全なレコードにアクセスでき、非常にコストがかかる可能性のある結合を実行する必要がないという、両方の長所を活用できます (等結合ではない結合は、信じられないほど爆発する可能性があります)。

SELECT t1.* 
FROM yourtable t1,
     (SELECT name, MIN(seqnum) as seqnum
      FROM yourtable
      GROUP BY name) t2
WHERE t1.name=t2.name
      AND t1.seqnum=t2.seqnum

結合構文を使用して (WHERE の代わりに) 同じ結果を達成することもできますが、この場合、where を使用すると何が起こっているのかが少し明確になると思います。

于 2009-01-29T23:11:46.577 に答える
0

テーブルtから名前を選択します。ここでseq_num=(テーブルttからmax(sequnum)を選択します。ここでt.name = tt.name)

しかし、私はグループ化の方が好きです。

于 2009-01-29T16:47:15.043 に答える
0
SELECT t1.*
FROM yourtable t1
 LEFT OUTER JOIN yourtable t2 
 ON (t1.name = t2.name AND t1.seqnum > t2.seqnum)
WHERE t2.seqnum IS NULL;

再。民主党のコメント:

単純に使用するGROUP BY name場合、選択リストnameには集計関数のみを含めることができますMIN()。グループごとに最小値が発生する行全体が本当に必要な場合がよくあります。

TOPソリューションを使用する場合 (またはLIMITMySQL、PostgreSQL、SQLite を使用する場合)、 に基づいて複数のグループの最小値を取得することはできませんname。1 つの の最小値のみを取得できますname

OPの質問の行間を読み、行全体が必要であり、質問に示されている列よりも多くの列があり(常に存在します)、目的のクエリは1つだけでなく複数の名前の結果を返す必要があると推測しました.


再。SquareCog のコメント:

あなたが提案する解決策も結合です:

SELECT t1.*
FROM yourtable t1
  JOIN (SELECT name, MIN(seqnum) AS seqnum FROM yourtable GROUP BY name) t2
  USING (name, seqnum);

ただし、このソリューションではおそらくインデックスを使用して結合を評価することはできませんが、私が提供したソリューションでは可能です。

于 2009-01-29T16:41:19.623 に答える