0

ドキュメント処理アプリをリファクタリングしていますが、多くのコードをクエリに置き換える機会があると思います。db テーブルには、ドキュメント内の辞書用語の出現ごとに行が含まれています。行には、辞書エントリの最初の文字の文書内での文字位置と、辞書用語に関連付けられているコード番号が含まれています。たとえば、1 つのドキュメントを処理した結果の一連の行を次に示します。

doc        pos        code
55          20          44
55         169          44
55         328          44
55          86         174
55          98         393
55         566         393

問題は、各コードが最初に出現した行のみを返すことです。したがって、この例では、行 1、4、および 5 が返されます。コードごとのグループがこれを行うことができるように「感じます」が、コードごとに最低の位置を持つ行を選択するグループの条件を理解できません。クエリ ソリューションは、ms sqlserver に対してのみ機能する必要があります。

4

3 に答える 3

3
select doc, code, min(pos) as pos
from t
group by doc, code
于 2013-06-25T22:04:13.890 に答える
1
SELECT doc, MIN(pos),code       
FROM Table1
group by doc, code

デモ: SQL フィドル

于 2013-06-25T22:04:34.967 に答える
1

のようなウィンドウ関数をサポートする rdbms を使用していると仮定するとROW_NUMBER、ここでは sql-server 2005 以降で動作する例を示します。

WITH CTE AS
(
    SELECT doc, pos, code, 
           RN = ROW_NUMBER()OVER(PARTITION BY doc,code Order By pos)
    from dbo.TableName
)
SELECT doc, pos, code
FROM CTE
WHERE RN = 1

ウィンドウ関数の利点は、ウィンドウ関数よりもGROUP BY実行可能で保守しやすく、順序を簡単に変更したり、他のウィンドウ関数を追加したりできることです。OVERまた、集計関数で句を使用することもできます。たとえばSUM(doc)OVER(PARTITION BY code)、group-by に追加したり、集計関数を適用したりする必要なく、すべての列を含めることができます。

デモ

に置き換えたいと思うかもしれませんROW_NUMBERDENSE_RANK自分で見てください:

ランキング関数 (Transact-SQL)

于 2013-06-25T22:06:20.850 に答える