質問
上司が私に割り当てを与えてくれました。約2週間後、解決策が分からないので、私はそれが可能かどうか分かりません。グループ。これがあなたの脳を壊すなら、私は謝ります。
最初に少しの背景:ユーザーがSQLを知らなくてもデータベースから必要なものを取り戻すことができるデータベースクエリアプリケーションを開発します。
私の問題:「個別」の方法をカスタマイズしたい選択が使用されます。選択した行に個別のキーワードを適用する代わりに、特定のフィールドのみに適用して、フィールドに一致する最初の行が使用されるようにします。例:
ボブ・ジョーンズ、122 Main Street、ポートランド、オレゴン州
スー・ジョーンズ、122 Main Street、ポートランド、オレゴン州
Mary Smith、458 32nd Street、ポートランド、オレゴン州
ラルフ・スミス、458 32nd Street、ポートランド、オレゴン州
次のように各住所の最初の行のみが返されるように、これが機能するようにします。
ボブ・ジョーンズ、122 Main Street、ポートランド、オレゴン州
メアリー・スミス、458 32nd Street、ポートランド、オレゴン州
通常の個別の場合、4行すべてが返されますが、これは必要以上です。私たちがこれをどのように行うことができるかについて、誰にもアイデアがありますか?ありがとう。
解決
WITH NumberedRows AS (
SELECT FirstName, LastName, Address,
ROW_NUMBER() OVER (PARTITION BY Address ORDER BY Id) as RowNumber
FROM Table
) SELECT FirstName, LastName, Address
FROM NumberedRows
WHERE RowNumber = 1;
PARTITION BY Address
はグループ化する列リストを指定し、 ORDER BY ID
は「最初」を定義する列リストを示します。アイテム付き。
(前のステートメントがセミコロンで終了していることを確認してください。)
他のヒント
通常の" SELECT DISTINCT"を実行する必要があります。実際に行うフィールドのみを照会するSQLステートメント。次に、それらを取得したら、一致するデータを持つTOP 1レコードを取得する別のクエリを実行して、区別できないフィールドを取得します。現時点では、1つのSQLステートメントでこれを行う方法がわかりません...
SELECT MIN(a.firstname + a.lastname)、アドレスfrom x Group By address。
これは非常に単純な答えですが、それはあなたの主張を理解させるものです。 " lesser"のみが返されます。個別の住所の名前。
区別するためにもフィールド連結を使用する必要がありますが、必要なものが得られます。