まず、どのようにスライスしても、一意のキーが必要です。列の組み合わせにすることもできますが、各行を一意に識別するための何らかの手段が絶対に必要です。それがなければ、最善の手段はそのような制約を追加することです。この制約に加えて、このタイプのリクエストは、単一の一意の列を使用することで最適に処理されます。ただし、そのような列がない場合は、それらを連結することにより、一意のキーを構成する列から列を作成できます。
Select T1.account, T1.phone, T1.subaccount, T1.locationId....
From "Table" As T1
Where (Cast(T1.UniqueCol1 As varchar(100))
+ "|" + Cast(T2.UniqueCol2 As varchar(100)
... ) = (
Select Min( Cast(T2.UniqueCol1 As varchar(100))
+ "|" + Cast(T2.UniqueCol2 As varchar(100))
...
)
From "Table" As T2
Where T2.account = T1.account
And T2.phone = T1.phone
)
この場合UniqueCol1、一意キーの列の1つをUniqueCol2表し、次の列を表します。これは決して高速なクエリではありません。単一の列が一意であることが保証されていると、この問題は非常に簡単になります。これで、MikeMのソリューションに似た何かを行うことができます。
Select T1.account, T1.phone, T1.subaccount, T1.locationId....
From "Table" As T1
Where UniqueCol = (
Select Min( T2.UniqueCol )
From "Table" As T2
Where T2.account = T1.account
And T2.phone = T1.phone
)
ここで重要な点は、上記の両方のソリューションで、「最初の」は、検出された最も低いソート済みキー値によって単純に決定されるということです。「最初」を日時列などの他の何かで決定する必要がある場合は、投稿でそのことを記載する必要があります。
編集
これがインポートであるという追加を考えると、最も簡単な解決策は、ステージングテーブルに自動インクリメント列を追加することです。SQL Serverでは、これはIDENTITY列になりますが、他のデータベース製品にも同等の列があります。これを行うと、上記で示した最後のソリューションでうまくいきます(UniqueColをID列の名前に置き換えるだけです)。