Ich habe hier eine Frage gestellt: /programming/43807566/how-to-divide-two-values-from-the-same-column-but-at-different-rows
Informationen zum Teilen von Werten aus derselben Tabelle in derselben Spalte, jedoch in verschiedenen Zeilen. Jetzt habe ich das Problem, wo ich mehr Zähler und Nenner (mit unterschiedlichen uns
) habe. Ist dies immer noch self join
ein guter Weg, um dieses Problem mit Postgres zu lösen, oder gibt es bessere Lösungen?
Beispiel:
| postcode | value | uns |
|----------|-------|-----|
| AA | 40 | 53 |
| BB | 20 | 53 |
| AA | 10 | 54 |
| AA | 20 | 55 |
| AA | 10 | 56 |
| AA | 30 | 57 |
| AA | 50 | 58 |
| BB | 10 | 54 |
| BB | 10 | 55 |
| BB | 70 | 56 |
| BB | 80 | 57 |
| BB | 10 | 58 |
Ergebnis sollte sein:
| postcode | formula |
|----------|------------|
| AA | 18.888... |
| BB | 14.375 |
Wo die Werte nach Postleitzahl gruppiert sind und die Formel lautet (Wert mit uns):
(V53 * V56 + V54 * V57 + V55 * V58) / (V56 + V57 + V58)
Achten Sie darauf, eine eventuelle Division durch Null zu vermeiden. Die Formel kann noch komplexer sein, aber das ist ein gutes Beispiel.
postgresql
pivot
computed-column
Randomisieren
quelle
quelle
uns
zu Spaltennamen werden - von dort aus sollte jede Formel, die die Werte verwendet, funktionsfähig werden. Wird die Formel fest codiert oder irgendwie dynamisch abgeleitet?Antworten:
Dies ist im Kern ein Pivot / Crosstab- Problem, wie Michael es bereits genau diagnostiziert hat .
Wenn Sie mit dem
tablefunc
Modul in Postgres nicht vertraut sind , lesen Sie hier die grundlegenden Anweisungen:Die Abfrage wird einfach und sehr schnell (schneller als andere hier vorgestellte Lösungen):
NULLIF
Division durch Null zu verhindern.dbfiddle hier
quelle
Sie können alle uns / value-Paare zu einem JSON-Objekt zusammenfassen und dann damit nach Namen auf die UNS-Werte zugreifen. Dies erfordert einige Änderungen, da die Werte nur als Text aus dem JSON-Objekt extrahiert werden können. Die Formel sieht dann jedoch Ihrer Beschreibung sehr ähnlich:
Ich habe die Aggregation, die Bewertung des Nenners und des Teilers und die endgültige Unterteilung in drei Schritte unterteilt, um die Lesbarkeit zu verbessern.
Online-Beispiel: http://rextester.com/IZYT54566
Sie können die Formel vereinfachen, indem Sie eine Funktion erstellen:
quelle
Das PIVOT-Muster würde dafür funktionieren. Es konvertiert die Werte von Zeilen in Spalten in einer einzelnen Zeile entsprechend ihrem gemeinsamen Schlüssel. Es gibt einige Möglichkeiten , dies zu implementieren. Einige erfordern nur einen einzigen Tabellenscan.
Nach dem PIVOT hätten Sie eine Tabelle mit einer Zeile pro Postleitzahl und einer Spalte pro Wert. Der Rest der Abfrage würde so geschrieben, als würde sie auf eine einzelne Tabelle verweisen.
quelle
Unter der Annahme, dass
(postcode, uns)
es sichUNIQUE
(wahrscheinlich um eine PK) handelt, kann das PIVOT-Muster, wie bereits von @ michael-green kommentiert , mithilfe der folgenden Abfrage portabel implementiert werden :Überprüfen Sie es bei SQLFiddle .
quelle
Angenommen, dies
(postcode, uns)
istUNIQUE
(wahrscheinlich eine PK), wahrscheinlich der einfachste Weg, wahrscheinlich der tragbarste, obwohl wahrscheinlich nicht der optimale: Verwenden Sie so viele Unterauswahlen wie nötig :Überprüfen Sie bei SQLFiddle .
quelle