3

SQL Server 2008 R2 (SP2) 10.50.4263

col1 にアプリケーション番号があり、col2 に初めてのバイヤー (ftb) のインジケータ (0 または 1) があります。1回の応募につき、応募者は1名または2名です。申請者が 2 人の申請の場合、次のように申請用の 2 つのエントリを取得します。

application  ftb
-----------  ---
1234          0
12345         0
12345         1
2345          1
23456         0
23456         0

望ましい結果は、それぞれ固有のアプリケーションと ftb です。アプリケーションに複数の ftb 値がある場合...最も高い値を取得します (常に 0 または 1)。

私はこれを見たいです:

application  ftb
-----------  ---
1234          0
12345         1
2345          1
23456         0

PARTITION を使用しようとしましたが、運がありません。テーブルは提供されていますが、変更できません。これは、Excel ではなく SQL で行う必要があります。私は百万回の順列を試しましたが、これを解決するために自己結合さえしました。立ち往生。

親切な魂が道を示すことができますか?

4

4 に答える 4

4
SELECT
application,
MAX(ftb) AS ftb
FROM
yourTable
GROUP BY application

テーブルの目的の出力に表示される行のみを表示し、他の行を削​​除したいという質問を理解しましたよね? これを実現する最も簡単な方法は、一時テーブルを使用することです。

SELECT
application,
MAX(ftb) AS ftb
INTO #yourTempTable
FROM
yourTable
GROUP BY application;

次に、他のすべての行を次のいずれかの方法で削除します

DELETE FROM yourTable WHERE application IN (SELECT DISTINCT application FROM #yourTempTable)

最後に、一時テーブルからテーブルに再度挿入します。

INSERT INTO yourTable (application, ftb) 
SELECT application, ftb FROM #yourTempTable;

以上です。

于 2013-06-21T00:35:11.400 に答える
0

列 "application" のパーティション内の行のシーケンス番号を返すには、列 "ftb" で ORDER BY 句を指定してランキング関数 ROW_NUMBER を使用します。したがって、重複する行をすべて削除できます

 ;WITH cte AS
 (
  SELECT ROW_NUMBER() OVER(PARTITION BY application ORDER BY ftb DESC) AS rn
  FROM dbo.YourTable
  )
  DELETE cte
  WHERE rn > 1

SQLFiddle のデモを見る

于 2013-06-21T06:35:41.600 に答える
0

ID 列もあると仮定します。

-- 1 もあるすべてのゼロを削除します。

DELETE FROM yourTable
WHERE ftb = 0 
AND application IN
(SELECT s.application
FROM yourTable AS s
WHERE s.ftb = 1)

-- アプリケーションごとに最も再送信されたもののみを保持します

DELETE FROM yourTable
WHERE ID NOT IN 
(SELECT MAX(s.ID)
FROM yourTable AS s
GROUP BY s.application)
于 2013-06-21T01:33:23.710 に答える
0

application 列で group by と組み合わせて ftb の max aggregate を使用できます。

Select application, Max(ftb) from yourtable group by application;
于 2013-06-21T00:37:46.090 に答える