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?
davy.ai
Cualquier ayuda sería muy apreciada.