Oracle-MIN als analytische Funktion - merkwürdiges Verhalten mit ORDER BY?

Diesem speziellen Fall wurde destilliert von einem Beispiel, wo der Programmierer davon ausgegangen, dass für zwei Sendungen in einen tank car, line #1 würde zuerst geladen werden. Ich korrigiert dies, dass für die Belastung in beliebiger Reihenfolge durchgeführt werden - allerdings habe ich entdeckt, dass MIN() OVER (PARTITION BY) ermöglicht eine ORDER BY in Oracle (dies ist nicht erlaubt im SQL-Server), und zusätzlich, es ändert das Verhalten der Funktion, wodurch die ORDER BY offenbar werden Hinzugefügt, um die PARTITION BY.

WITH data AS (
SELECT 1 AS SHIPMENT_ID, 1 AS LINE_NUMBER, 2 AS TARE, 3 AS GROSS FROM DUAL
UNION ALL
SELECT 1 AS SHIPMENT_ID, 2 AS LINE_NUMBER, 1 AS TARE, 2 AS GROSS FROM DUAL
)
SELECT MIN(tare) OVER (PARTITION BY shipment_id) first_tare
,MAX(gross) OVER (PARTITION BY shipment_id) last_gross
,FIRST_VALUE(tare) OVER (PARTITION BY shipment_id ORDER BY LINE_NUMBER) first_tare_incorrect
,FIRST_VALUE(gross) OVER (PARTITION BY shipment_id ORDER BY LINE_NUMBER DESC) last_gross_incorrect
,MIN(tare) OVER (PARTITION BY shipment_id ORDER BY LINE_NUMBER) first_tare_incorrect_still
,MAX(gross) OVER (PARTITION BY shipment_id ORDER BY LINE_NUMBER DESC) last_gross_incorrect_still
,MIN(tare) OVER (PARTITION BY shipment_id, LINE_NUMBER) first_tare_incorrect_still2
,MAX(gross) OVER (PARTITION BY shipment_id, LINE_NUMBER) last_gross_incorrect_still2
 FROM data

Einer SQL-Server-Beispiel (mit nicht zutreffenden code auskommentiert):

WITH data AS (
SELECT 1 AS SHIPMENT_ID, 1 AS LINE_NUMBER, 2 AS TARE, 3 AS GROSS -- FROM DUAL
UNION ALL
SELECT 1 AS SHIPMENT_ID, 2 AS LINE_NUMBER, 1 AS TARE, 2 AS GROSS -- FROM DUAL
)
SELECT MIN(tare) OVER (PARTITION BY shipment_id) first_tare
,MAX(gross) OVER (PARTITION BY shipment_id) last_gross
-- ,FIRST_VALUE(tare) OVER (PARTITION BY shipment_id ORDER BY LINE_NUMBER) first_tare_incorrect
-- ,FIRST_VALUE(gross) OVER (PARTITION BY shipment_id ORDER BY LINE_NUMBER DESC) last_gross_incorrect
-- ,MIN(tare) OVER (PARTITION BY shipment_id ORDER BY LINE_NUMBER) first_tare_incorrect_still
-- ,MAX(gross) OVER (PARTITION BY shipment_id ORDER BY LINE_NUMBER DESC) last_gross_incorrect_still
,MIN(tare) OVER (PARTITION BY shipment_id, LINE_NUMBER) first_tare_incorrect_still2
,MAX(gross) OVER (PARTITION BY shipment_id, LINE_NUMBER) last_gross_incorrect_still2
 FROM data

Frage also: Was ist Oracle tut und warum und ist es richtig?

  • ich denke, der Denali hat das jetzt
  • Smith ja, das Verhalten, die sollten identisch sein, und die ORDER BY sollte Auswirkungen auf das Verhalten. Ich verstehe nicht, warum Oracle nicht gegen die ORDER BY wie SQL Server ist, und dann, WARUM es wirkt sich auf das Verhalten.
  • Werfen Sie einen Blick auf diesen link geniiius.com/blog/t-sql-enhancements-over-clause Es erklärt das Verhalten, die Sie Fragen, die auf SQL Server Denali, und warum es Sinn macht
InformationsquelleAutor Cade Roux | 2011-09-12
Schreibe einen Kommentar