1

SQLコマンドを介してDbaseテーブルを操作しています。次の無料のテーブルを使用できます。

import1

アカウント、電話、サブアカウント、locationid

アカウントと電話のそれぞれのユニークな組み合わせの最初の出現が必要です。テーブル内のどのフィールドも一意ではありません。個別の修飾子を使用してデータの部分サブセットを取得できますが、選択するレコードに関連する他のフィールドも必要です。

これはできますか?ありがとう

編集:選択したレコードを修飾する必要があることがわかりました。

例:

Import1

001 123-4567 123 0110

001 123-0001 234 0220

001 123-4567 456 0011

002 222-2222 010 0110

003 333-3333 333 0330

戻る必要があります

import1

001 123-4567 123 0110

001 123-0001 234 0220

002 222-2222 010 0110

003 333-3333 333 0330

それがここでの私の意図です。

4

5 に答える 5

1

まず、どのようにスライスしても、一意のキーが必要です。列の組み合わせにすることもできますが、各行を一意に識別するための何らかの手段が絶対に必要です。それがなければ、最善の手段はそのような制約を追加することです。この制約に加えて、このタイプのリクエストは、単一の一意の列を使用することで最適に処理されます。ただし、そのような列がない場合は、それらを連結することにより、一意のキーを構成する列から列を作成できます。

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列の名前に置き換えるだけです)。

于 2010-07-22T23:57:01.910 に答える
0

次のことを試してください。

SELECT *, ROW_NUMBER() OVER (Order By account) AS Id
INTO #Table FROM import1

これで主キーができました-

    SELECT account, phone, MAX(Id) AS Id
    FROM #Table
    GROUP BY account, phone

編集:私は重要な部分を忘れました。ドー。

SELECT * FROM #Table T
WHERE T.Id IN (
        SELECT MAX(Id) AS Id
        FROM #Table
        GROUP BY account, phone )
于 2010-07-22T23:19:05.313 に答える
0

電話/アカウント情報の一意のコレクションが必要であり、次にその一意のコンボの各サブアカウントと場所を取得する必要があるようです。これは正しいです?

私があなたを正しく理解しているなら、あなたは次のフォーマットで新しいテーブルまたはビューを作りたいかもしれません:

import1
-------
id  |Phone  | Account

SubAccount  //SubAccountId may not be needed here...
----------
SubAccountId  |ImportId  | SubAccount

ImportLocation
--------------
ImportId |LocationId

あなたがやろうとしていることを私が誤解した場合は教えてください...

アップデート:

提案のこの修正バージョンは機能するはずです。電話から最小を取り除いて、明確なものを追加しただけです:

Select distinct account, 
       phone, 
       min(subaccount), 
       min(locationid) 
from  import1 
group by account, phone
于 2010-07-22T23:36:41.347 に答える
0

もう少しエレガントなソリューション:

SELECT account, phone, subaccount, locationid
FROM import1
WHERE account IN
(SELECT DISTINCT account, phone FROM import1)
于 2010-07-23T00:11:34.700 に答える
0
select account, min(phone), min(subaccount), min(locationid) 
from import1 
group by account, phone 

私のIDE(Visual Fox Pro v9)に最適なソリューションのようです

于 2010-07-23T00:23:52.890 に答える