SQLクエリのクエリセット

極星

postgresクエリの問題の説明、サンプルデータ、および一意の値のフィルタリングを参照してくださいSQLをクエリセットに変換したい。近くにいるような気がしますが、完全ではありません。

SELECT Column_A, Column_B, Column_C, 0 as RN
FROM TABLE
WHERE COLUMN_C is null and Column_B in (UserA, UserB, UserC)

UNION ALL

SELECT Column_A, Column_B, Column_C, RN
FROM (
  SELECT A.*, ROW_NUMBER() over (partition by A.column_C Order by case A.column_B when 'UserA' then 0 else 1 end, U.Time_Created) rn
  FROM Table A
  INNER JOIN user U
    on U.Column_B = A.Column_B
  WHERE A.Column_C is not null and ColumnB in (userA, userB, UserC)) B
WHERE RN = 1

これは私がこれまでに持っているものです:

qs1 = Table.objects.filter(Column_C__isnull=True).annotate(rn=Value(0))

qs2 = Table.objects.annotate(rn=Window(
   expression=RowNumber(),
   partition_by=[Column_C],
   order_by=[Case(When(Column_B=UserA, then=0), default=1), 'Table_for_Column_B__time_created']
)).filter(Column_C__isnull=False, rn=1)

return qs2.union(qs1)

これは機能しません。

django.db.utils.NotSupportedError: Window is disallowed in the filter clause.

次に、行番号= 1の行のみが必要なため、サブクエリで中間結果を抽出して、外部クエリでフィルタリングできるようにします。

qs1 = Table.objects.filter(Column_C__isnull=True).annotate(rn=Value(0))

qs2 = Table.objects.annotate(rn=Window(
   expression=RowNumber(),
   partition_by=[Column_C],
   order_by=[Case(When(Column_B=UserA, then=0), default=1), 'Table_for_Column_B__time_created']
)).filter(pk=OuterRef('pk'))

qs3 = Table.objects.annotate(rn=Subquery(qs2.values('rn'))).filter(Column_C__isnull=False, rn=1)

return qs3.union(q1)

今回も例外はありませんが、うまくいきません。テーブルの各行には、row_number=1の注釈が付けられています。元の例では、クエリセットは5行にフィルタリングするのではなく、7行すべてを返します。

  1. ウィンドウ式をフィルタリングすることは可能ですか?
  2. ウィンドウクエリをサブクエリに変換するときに覚えておくべきベストプラクティスは何ですか?
  3. クエリセットを作成するためのより良い方法はありますか?
イアン・シェルビントン

ウィンドウ式なしでSubQueryを使用してこれを実行できるはずです

最初に、Column_B=UserA一致でソートされたサブクエリのクエリセットを作成し、次にtime_created

from django.db.models import Case, When, Q, Subquery, OuterRef

tables_ordered = Table.objects.filter(
    Column_C=OuterRef('Column_C')
).annotate(
    user_match=Case(When(Column_B=UserA, then=0), default=1)
).order_by('user_match', 'time_created')

次に、このサブクエリは、ウィンドウ関数から最初の行を選択するのと同様に、Column_Cから一致する最初のPKを返します。OuterRef

first_pk_for_each_column_c = Subquery(tables_ordered.values('pk')[:1])

次に、2つのQオブジェクトでORを作成し、NULLの場合、またはサブクエリの最初のオブジェクトと一致する場合は行を選択しますColumn_Cpkpk

Table.objects.filter(
    Q(Column_C__isnull=True) | Q(pk=first_pk_for_each_column_c)
)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

SQLクエリのPython変数

linqクエリプロパティの最初のセットをオプションの文字列として返す最も簡単な方法は何ですか?

POSTリクエストでリダイレクトする

AzureInsightsリクエストログ

UnityWebリクエストへのcURLコマンド

ダイクストラのアルゴリズムネガティブエッジ

このSQLクエリをLaravelで雄弁に変換する方法

サブクエリなしのMySQLマルチステップGROUPBY

async / awaitを使用したreact-reduxでの非同期リクエスト

異なるデータで複数のリクエストを行う

Google MapsPlatformが突然私のリクエストを拒否しました

着信HTTPリクエストをテストするためのNodeJSライブラリ

NestJs httpリクエストを完全にカバーしてユニットテストする方法は?

220億レコードのMysqlRAM要件クエリの選択

jMeterFTPリクエストオプションなし

Visual Studioのデバッグエラー:サイトにアクセスできません

グーグルアプリエンジンとアンドロイドプロジェクトへのリンク

Atomエディターファイルツリーをリセットします

Androidのメッセージアプリは、ユーザーの操作なしでGETリンクをトリガーします

クラス内のリストを操作するときのC# 'オブジェクト参照が設定されていません'エラー

NetworkManager設定のエクスポート

Cocosクリエーターのシーン間を移動する方法は?

JVMのサンドボックス化されたスクリプト言語?

別のスクリーンセッション内からスクリーンセッションを開始する

SQL Server Management Studio(SSMS)でクエリ結果を分離する方法はありますか?

Firebaseでデフォルトのプロジェクトホスティングをリセットするにはどうすればよいですか?

cmdで複数のクエリを実行してログに記録するバッチファイルを作成する方法

JMeterのJSONパスエクストラクタ

cygwinホームディレクトリ外のさまざまなディレクトリにアクセスする方法