In Oracle 11 und höher können Sie PIVOT verwenden. In der folgenden Lösung verwende ich LISTAGG, um alle Daten im Falle von Bindungen anzuzeigen. Eine andere Möglichkeit ist, bei Krawatten das jüngste Datum zu zeigen, an dem die extreme Temperatur erreicht wurde; Wenn dies bevorzugt ist, ersetzen Sie einfach LISTAGG(dt, ....)
(einschließlich WITHIN GROUP
Klausel) mit MAX(dt)
. In diesem Fall ist die erste von Gordon angebotene Lösung (mit der Funktion first
) ohnehin effizienter - keine Notwendigkeit zum Pivotieren.
Beachten Sie, dass ich "Datum" in "dt" geändert habe - DATE ist ein reserviertes Wort in Oracle. Ich zeige auch die Reihen zuerst nach Land, dann nach Stadt (die logischere Reihenfolge). Ich habe Testdaten in einer WITH-Klausel erstellt, aber die Lösung ist alles unterhalb der Kommentarzeile.
with
inputs (city, country, dt, temperature) as (
select 'Palermo', 'Italy' , date '2014-02-13', 3 from dual union all
select 'Palermo', 'Italy' , date '2002-01-23', 3 from dual union all
select 'Palermo', 'Italy' , date '1998-07-22', 42 from dual union all
select 'Palermo', 'Italy' , date '1993-08-24', 30 from dual union all
select 'Maseru' , 'Lesotho', date '1994-01-11', 34 from dual union all
select 'Maseru' , 'Lesotho', date '2004-08-13', 12 from dual
)
-- >> end test data; solution (SQL query) begins with the next line
select country, city,
"'min'_DT" as date_min_temp, "'min'_TEMP" as min_temp,
"'max'_DT" as date_max_temp, "'max'_TEMP" as max_temp
from (
select city, country, dt, temperature,
case when temperature = min(temperature)
over (partition by city, country) then 'min'
when temperature = max(temperature)
over (partition by city, country) then 'max'
end as flag
from inputs
)
pivot (listagg(to_char(dt, 'dd-MON-yyyy'), ', ')
within group (order by dt) as dt, min(temperature) as temp
for flag in ('min', 'max'))
order by country, city -- ORDER BY is optional
;
COUNTRY CITY DATE_MIN_TEMP MIN_TEMP DATE_MAX_TEMP MAX_TEMP
------- ------- ------------------------ ---------- -------------- ----------
Italy Palermo 23-JAN-2002, 13-FEB-2014 3 22-JUL-1998 42
Lesotho Maseru 13-AUG-2004 12 11-JAN-1994 34
2 rows selected.
, was Sie wollen für eine bestimmte Stadt angezeigt, wenn Sie es sind zwei verschiedene Zeiten, in denen die Mindesttemperatur erreicht wurde? – mathguy
Guter Punkt. Ich kann mit jedem des Datums umgehen ... –