es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Conjunto de consultas para una consulta SQL.

Consulte https://stackoverflow.com/questions/70026416/filtering-unique-values para obtener la descripción del problema, datos de muestra y consulta postgres. Me gustaría convertir el SQL en un queryset. Siento que estoy cerca pero no del todo.

SELECT ColumnA, ColumnB, ColumnC, 0 as RN
FROM TABLE
WHERE COLUMNC is null and Column_B in (UserA, UserB, UserC)

UNION ALL

SELECT ColumnA, ColumnB, ColumnC, RN
FROM (
  SELECT A.*, ROWNUMBER() over (partition by A.columnC Order by case A.columnB when 'UserA' then 0 else 1 end, U.TimeCreated) rn
  FROM Table A
  INNER JOIN user U
    on U.ColumnB = A.ColumnB
  WHERE A.ColumnC is not null and ColumnB in (userA, userB, UserC)) B
WHERE RN = 1

Esto es lo que tengo hasta ahora:

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

qs2 = Table.objects.annotate(rn=Window(
   expression=RowNumber(),
   partitionby=[ColumnC],
   orderby=[Case(When(ColumnB=UserA, then=0), default=1), 'TableforColumnBtimecreated']
)).filter(Column_Cisnull=False, rn=1)

return qs2.union(qs1)

Esto no funciona del todo.

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

A continuación, intenté sacar el resultado intermedio en una subconsulta, para permitir el filtrado en la consulta exterior, ya que solo necesito filas con número de fila = 1.

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

qs2 = Table.objects.annotate(rn=Window(
   expression=RowNumber(),
   partitionby=[ColumnC],
   orderby=[Case(When(ColumnB=UserA, then=0), default=1), 'TableforColumnBtimecreated']
)).filter(pk=OuterRef('pk'))

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

return qs3.union(q1)

Esta vez no hay excepciones, pero esto no funciona. Se anota cada fila de la tabla con row_number=1. En el ejemplo original, la consulta devuelve todas las 7 filas en lugar de filtrar a 5.

¿Es posible filtrar en expresiones de ventana?
¿Cuáles son las mejores prácticas a tener en cuenta al convertir consultas de ventana en subconsultas?
¿Existe una mejor manera de estructurar el queryset?

Tags:  , ,

Answer

Comments are closed.