В Oracle 11 и выше вы можете использовать PIVOT. В приведенном ниже решении я использую LISTAGG для отображения всех дат в случае связей. Другим вариантом является, в случае связей, показать самую последнюю дату, когда была достигнута экстремальная температура; если это является предпочтительным, просто замените LISTAGG(dt, ....)
(включая предложение WITHIN GROUP
) MAX(dt)
. Однако в этом случае первое решение, предлагаемое Гордоном (с использованием функции first
), в любом случае более эффективно - нет необходимости в повороте.
Обратите внимание, что я изменил «дату» на «dt» - DATE является зарезервированным словом в Oracle. Я также показываю строки по странам сначала, затем город (более логичный порядок). Я создал тестовые данные в предложении WITH, но решение - это все, что находится ниже строки комментария.
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.
Что вы хотите отображается, если для данного города есть два разных дня, когда была достигнута минимальная температура? – mathguy
Хорошая точка. Я могу иметь дело с любой датой ... –