日付のリストがあります:
イベント日程
- 06/04/1998
- 12/08/1980
- 29/11/2010
- 16/06/2002
- 20/10/2007
- 10/07/2000
これらすべての年の中で、日/月ごとに最も早いイベント日を取得したいと思います。したがって、最も早いのは 06/04/1998 で、最新のイベント日付を取得したい場合は 29/11/2010 です。これの構文をどのように記述すればよいですか?
日付のリストがあります:
イベント日程
- 06/04/1998
- 12/08/1980
- 29/11/2010
- 16/06/2002
- 20/10/2007
- 10/07/2000
これらすべての年の中で、日/月ごとに最も早いイベント日を取得したいと思います。したがって、最も早いのは 06/04/1998 で、最新のイベント日付を取得したい場合は 29/11/2010 です。これの構文をどのように記述すればよいですか?
SELECT EXTRACT( MONTH FROM date_column),
EXTRACT( DAY FROM date_column),
EXTRACT( YEAR FROM date_column),
date_column
FROM table
ORDER BY 1, 2, 3
最初のレコードを選択します
SELECT *
FROM (SELECT EXTRACT( MONTH FROM date_column),
EXTRACT( DAY FROM date_column),
EXTRACT( YEAR FROM date_column),
date_column
FROM table
ORDER BY 1, 2, 3)
WHERE rownum <= 1
SELECT MAX(date), MIN(date), YEAR(date) year, MONTH(date) month
FROM table
GROUP BY YEAR(date), MONTH(date)
注: これは疑似コードです。日付から年と月を抽出するには、オラクルの正しい関数を調べる必要があります。
次の関数インデックスも役立ちます。YEAR(date), MONTH(date), date
あなたが本当にどの年でも日/月ごとに最も早い日付を望んでいることを私が理解していると仮定すると、分析関数はこれを行うことができます:
select dt from (
select dt,
dense_rank() over (partition by 1 order by to_char(dt, 'MMDD'),
to_char(dt, 'YYYY')) rn
from t
)
where rn = 1;
DT
----------
06/04/1998
ここでの内部select
は、指定した順序に基づいて、各日付にランキングを割り当てるために使用dense_rank()
しています-これを行う方法は他にもありますが、日/月を文字列に変換することはうまくいくようです。 1年以上で同じ日/月を持っている(その場合は最も早い年が必要だと思います)。それ自体で、いくつかの追加の日付を追加すると、次のようになります。
alter session set nls_date_format = 'DD/MM/YYYY';
with t as (
select to_date('06/04/1998') as dt from dual
union all select to_date('12/08/1980') from dual
union all select to_date('29/11/2010') from dual
union all select to_date('16/06/2002') from dual
union all select to_date('20/10/2007') from dual
union all select to_date('10/07/2000') from dual
union all select to_date('10/07/1999') from dual
union all select to_date('06/04/1999') from dual
)
select dt,
dense_rank() over (partition by 1 order by to_char(dt, 'MMDD'),
to_char(dt, 'YYYY')) rn
from t;
DT RN
---------- ----------
06/04/1998 1
06/04/1999 2
16/06/2002 3
10/07/1999 4
10/07/2000 5
12/08/1980 6
20/10/2007 7
29/11/2010 8
8 rows selected.
dt
外側の選択は、ランクが値の値を選択するだけrn = 1
です。
最新のものを見つけたい場合は、order by
句を変更して含めるdesc
ようにし、逆の順序で並べ替えられるようにします。
次はどうですか:
日付を...から選択します。ここで、rownum = 1月ごとの注文(日付)* 100 +日(日付)desc
日付を選択...ここで、rownum = 1月(日付)による注文* 100 +日(日付)asc
そのリストがすでにテーブルにある場合。
Max(fieldName)またはMin(fieldName)を選択するだけです