1

日付のリストがあります:

イベント日程

- 06/04/1998
- 12/08/1980
- 29/11/2010
- 16/06/2002
- 20/10/2007
- 10/07/2000

これらすべての年の中で、日/月ごとに最も早いイベント日を取得したいと思います。したがって、最も早いのは 06/04/1998 で、最新のイベント日付を取得したい場合は 29/11/2010 です。これの構文をどのように記述すればよいですか?

4

5 に答える 5

2
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
于 2012-09-13T08:26:01.830 に答える
2
SELECT MAX(date), MIN(date), YEAR(date) year, MONTH(date) month
FROM table
GROUP BY YEAR(date), MONTH(date)

注: これは疑似コードです。日付から年と月を抽出するには、オラクルの正しい関数を調べる必要があります。

次の関数インデックスも役立ちます。YEAR(date), MONTH(date), date

于 2012-09-13T07:29:44.837 に答える
1

あなたが本当にどの年でも日/月ごとに最も早い日付を望んでいることを私が理解していると仮定すると、分析関数はこれを行うことができます:

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ようにし、逆の順序で並べ替えられるようにします。

于 2012-09-13T08:25:36.987 に答える
0

次はどうですか:

日付を...から選択します。ここで、rownum = 1月ごとの注文(日付)* 100 +日(日付)desc

日付を選択...ここで、rownum = 1月(日付)による注文* 100 +日(日付)asc

于 2012-09-13T07:30:16.973 に答える
0

そのリストがすでにテーブルにある場合。

Max(fieldName)またはMin(fieldName)を選択するだけです

于 2012-09-13T07:30:40.900 に答える