我有一個包含 3 列的 Oracle 表。FILE_NUM,START_DATE,END_DATE
| FILE_NUM | 開始日期 | 結束日期 |
|---|---|---|
| 1111 | 1977 年 4 月 4 日 | 1984 年 6 月 30 日 |
| 1112 | 1987 年 1 月 3 日 | 2010 年 9 月 5 日 |
| 1113 | 可能。1962 年 14 月 | 1998 年 1 月 30 日 |
| 1114 | 2001 年 10 月 9 日 | 2025 年 8 月 22 日 |
| 1113 | 可能。1962 年 14 月 | 1998 年 1 月 30 日 |
| 1114 | 2003 年 11 月 18 日 | 2028 年 8 月 22 日 |
| 等等 |
我想查詢每十年存在的檔案數。就像是:
| 十年 | 數數 |
|---|---|
| 1960-1969 | 10 |
| 1970-1979 | 25 |
| 1980-1989 | 42 |
邏輯是,如果該檔案存在于任何十年中的任何時間點,則在每個十年中計算它。因此,對于 file_num 1112,它應該計入 1980 年代、1990 年代、2000 年代和 2010 年代。
我什至不知道這是否可能。我在我的查詢中修改了幾次,但我不確定我是否知道足夠的函式或技術來獲得這種結果。
謝謝你的幫助。
編輯:
我應該澄清如何計算。我需要以 3 種方式接近日期范圍,以便捕獲每個十年記憶體在哪些 file_nums。
- 如果它開始于十年范圍之間,請數一數。
- 如果它在十年范圍內結束,請計算它。
- 如果它在十年范圍之前開始并在十年范圍之后結束,請計算它。
我制作了以下 SQL。我仍在試圖弄清楚它是否在做我想做的事情。如果有人有建議
with decades as
(
select
concat(concat(floor(extract(year from t.start_date)/10)*10, '-'), floor(extract(year from t.start_date)/10)*10 9) DECADE
from
table t
group by
concat(concat(floor(extract(year from t.start_date)/10)*10, '-'), floor(extract(year from t.start_date)/10)*10 9)
)
select
count(a.file_num),
decades.decade
from
table a,
decades
where
extract(year from a.start_date) between extract(year from to_date(SUBSTR(decades.decade,0,4), 'YYYY')) and extract(year from to_date(SUBSTR(decades.decade,6,9), 'YYYY'))
or
extract(year from a.end_date) between extract(year from to_date(SUBSTR(decades.decade,0,4), 'YYYY')) and extract(year from to_date(SUBSTR(decades.decade,6,9), 'YYYY'))
or
(extract(year from a.start_date) < extract(year from to_date(SUBSTR(decades.decade,0,4), 'YYYY'))
and
extract(year from a.end_date) > extract(year from to_date(SUBSTR(decades.decade,6,9), 'YYYY'))
)
group by
decades.decade
order by
decades.decade
uj5u.com熱心網友回復:
您還可以利用 connect by 子句來做到這一點。我假設您的真實資料中沒有任何重復的行(這些列FILE_NUM、START_DATE、END_DATE應該是唯一的)。
SELECT dec_start, dec_end, COUNT(*) nb
FROM (
SELECT t.*, level
, 10 * trunc( extract ( year from (START_DATE) ) / 10 ) 10 * LEVEL - 10 dec_start
, 10 * trunc( extract ( year from (START_DATE) ) / 10 ) 10 * LEVEL - 1 dec_end
FROM YourTable T
CONNECT BY
10 * TRUNC( EXTRACT ( YEAR FROM (START_DATE) ) / 10 ) 10 * LEVEL - 10
< 10 * CEIL( EXTRACT ( YEAR FROM (END_DATE) ) / 10 )
AND PRIOR FILE_NUM = FILE_NUM
AND PRIOR START_DATE = START_DATE
AND PRIOR END_DATE = END_DATE
AND PRIOR SYS_GUID() IS NOT NULL
)
group by dec_start, dec_end
order by dec_start, dec_end
;

并加入主表:
select d.decade,
count(file_num) as count
from table m
join decade d
on m.start_date >= d.decade_start_date
join decade d2
on m.end_date <= d2.decade_end_date
where 1 = 1
and d.decade = d2.decade
group by 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/406506.html
標籤:
上一篇:PLSQL結果到資料透視表
下一篇:如何在oracle上分隔年份范圍
