Oracle 11以上では、PIVOTを使用できます。下のソリューションでは、私はLISTAGGを使用して、ネクタイの場合のすべての日付を表示します。別の選択肢は、ネクタイの場合、極端な温度に達したときの最新の日付を表示することです。これが望ましい場合は、LISTAGG(dt, ....)
(WITHIN GROUP
句を含む)をMAX(dt)
に置き換えてください。しかし、その場合、Gordonが提供する最初のソリューション(first
関数を使用)は、とにかく効率的です。ピボットを必要としません。
「date」を「dt」に変更しました.DATEはOracleでは予約語です。私はまた、まず国、次に都市(より論理的な順序)の行を示します。 WITH句でテストデータを作成しましたが、解決策はコメント行の下にあります。代わりにkeep/dense_rank first
機能の
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
良い点。私は日付のいずれかを扱うことができます... –