1

「機能的に重複した」レコードを含むテーブルがあります-IDは異なりますが、「ユーザーデータ」の4つの列(さらに多くの列)は同一です。そのような重複があるすべてのレコードを選択するクエリが機能しています。

ここで、重複の各グループから、最初に列がnullでないものを選択したいと思いAます-データから、グループごとにそのような行が最大1行あることを確認しました-そして、この特定のグループに何もない場合、次に column の最小値ID

どうすればそれを選択できますか? CASE の THEN で非集計を、ELSE で集計を正確に使用することはできません。たとえば、これは機能しません:

SELECT CASE
           WHEN d.A IS NULL THEN d.ID
           ELSE MIN(d.ID) END,
       d.B,
       d.C,
       d.E,
       d.F
FROM TABLE T
JOIN (my duplicate query here) D ON T.B=D.B
AND T.C=D.C
AND T.E=D.E
AND T.F=D.F
GROUP BY T.B,
         T.C,
         T.E,
         T.F

エラー:

列 A は、GROUP BY 句に指定するか、集計関数で使用する必要があります。

4

1 に答える 1

1

これは根本的に簡単にすることができます:

SELECT DISTINCT ON (b, c, e, f)
       b, c, e, f, id   -- add more columns freely
FROM   (<duplicate query here>) sub
ORDER  BY b, c, e, f, (a IS NOT NULL), id
  • 重複したクエリにはすべての列があります。JOINベーステーブルに再度アクセスする必要はありません。

  • 標準 SQL の Postgres 拡張機能を使用しますDISTINCT: DISTINCT ON:

  • Postgres には適切なブール型があります。ORDER BY式を直接ブール化できます。シーケンスはFALSE(0)、TRUE(1)、NULL(NULL) です。a が NULL の場合、この式は でFALSEあり、最初にソートされます: (a IS NOT NULL). 残りは によって注文されidます。出来上がり。

  • の選択はID自動的に行われます。説明によると、このクエリで選択された行の ID が必要です。もう何もする必要はありません。

  • おそらく、これを重複したクエリに直接統合できます。

于 2013-04-15T23:29:09.430 に答える