Ich versuche, eine Abfrage zu erstellen, die ich nicht verwenden muss GROUP BY, um meine Elemente in anderen Daten in Zeilen aufgeteilt werden. Hier ist was ich habe, was läuft, aber ich bekomme mehrere Zeilen für die gleichen patient_id
und die last_service
und last_payment
nie in der gleichen Zeile erscheinen. Ich bekomme 3 Zeilen, wo sie sich zu teilen scheinen, durch last_service
, last_payment
, und eine Zeile, wo beide NULL sind. Hier ist meine Frage:Mehrere Zeilen für denselben Bezeichner
WITH adj_rep_les AS(
SELECT DISTINCT t.clinic, t.patient_id, a.adj_desc
FROM transactions t
LEFT JOIN adjustments a
ON(t.clinic=a.clinic AND a.adjustment_id=t.adjustment_id)
WHERE a.adj_desc LIKE '%TAB%'
AND time_ran > '2016-03-27')
SELECT DISTINCT
c.clinic_id,
w.patient_id,
p.city,
p.state,
p.zipcode,
SUM(t.amount) OVER (PARTITION BY w.clinic, w.patient_id) AS balance,
CASE WHEN t.impacts='P' THEN FIRST_VALUE(t.date_entered) OVER (PARTITION BY w.clinic, w.patient_id ORDER BY t.date_entered DESC) END AS last_service,
CASE WHEN t.impacts='C' THEN FIRST_VALUE(t.date_entered) OVER (PARTITION BY w.clinic, w.patient_id ORDER BY t.date_entered DESC) END AS last_payment,
FIRST_VALUE(s.description) OVER (PARTITION BY w.clinic, w.patient_id ORDER BY t.date_entered DESC) AS service_done
FROM adj_rep_les w
LEFT JOIN clinic_master c
ON (w.clinic=c.clinic)
LEFT JOIN patient p
ON (w.clinic=p.clinic AND w.patient_id=p.patient_id)
LEFT JOIN transactions t
ON (w.clinic=t.clinic AND w.patient_id=t.patient_id)
LEFT JOIN services s
ON (t.clinic=s.clinic AND t.service_code=s.service_code)
Irgendwelche Gedanken? Ich würde auch erwähnen, dass die FIRST_VALUE
innerhalb der CASE
scheinen nicht zu arbeiten und geben das gleiche Ergebnis, unabhängig davon, ob Sie den Filter für t.impacts
ignorieren. mit MAX (t.date_entered) im Fall Alternativ versucht, aber das erfordert eine GROUP BY
aufgrund MAX
aggregierter Funktion
Beispieldaten Ergebnisse sind:
Vielen Dank im Voraus.
Nur eine Vermutung, wie keine Beispieldaten und ddl zur Verfügung gestellt. Versuchen Sie 'CASE WHEN t.impacts =' P 'zu verschieben THEN FIRST_VALUE (t.date_entered) OVER (PARTITION VON w.clinic, w.patient_id ORDER BY t.date_entered DESC) END AS last_service, FALL WENN t.impacts =' C 'THEN FIRST_VALUE (t.date_entered) OVER (PARTITION BY w.clinic, w.patient_id ORDER BY t.date_entered DESC) END ALS last_payment, 'to CTE und pivotieren sie in CTE und löscht den Join mit der Transaktion in main SELECT. – Serg