简体   繁体   English

SQLPlus 中的时间维度表

[英]Time dimension table in SQLPlus

I'm doing a datawarehouse project for college with Oracle Database (SQLPlus).我正在使用 Oracle 数据库(SQLPlus)为大学做一个数据仓库项目。 I need to create the time dimension table and to populate it.我需要创建时间维度表并填充它。 The table needs to be like this:该表需要是这样的:

在此处输入图像描述

It needs to go from 2004 to 2019.从 2004 年到 2019 年需要 go。

I've tried different things and queries that I've found but they don't works and, sadly, I don't know enough about SQLPlus to create one on my own (or to successfully modify one).我尝试了不同的东西和我发现的查询,但它们不起作用,遗憾的是,我对 SQLPlus 的了解不够,无法自己创建一个(或成功修改一个)。 I'm completely lost.我完全迷路了。

Thank you very much for your help and patience.非常感谢您的帮助和耐心。

Do not store all the columns;不要存储所有列; use virtual columns instead to calculate derived data otherwise you will find that your columns could be inconsistent:使用虚拟列来计算派生数据,否则您会发现列可能不一致:

CREATE TABLE table_name (
  id             NUMBER(10,0)
                 GENERATED ALWAYS AS IDENTITY
                 CONSTRAINT table_name__id__pk PRIMARY KEY,
  "DATE"         DATE
                 CONSTRAINT table_name__date__nn NOT NULL
                 CONSTRAINT table_name__date__u UNIQUE
                 CONSTRAINT table_name__date__chk CHECK ( "DATE" = TRUNC( "DATE" ) ),
  id_day_of_week NUMBER(1,0) 
                 GENERATED ALWAYS AS ( "DATE" - TRUNC( "DATE", 'IW' ) + 1 ),
  day_of_week    VARCHAR2(9)
                 GENERATED ALWAYS AS ( CAST( TRIM( TO_CHAR( "DATE", 'DAY', 'NLS_DATE_LANGUAGE = AMERICAN' ) ) AS VARCHAR2(9) ) ),
  is_holiday     NUMBER(1,0)
                 CONSTRAINT table_name__id_holiday__chk CHECK ( is_holiday IN ( 0, 1 ) ),
  id_month       NUMBER(2,0)
                 GENERATED ALWAYS AS ( EXTRACT( MONTH FROM "DATE" ) ),
  month          VARCHAR2(9)
                 GENERATED ALWAYS AS ( CAST( TRIM( TO_CHAR( "DATE", 'MONTH', 'NLS_DATE_LANGUAGE = AMERICAN' ) ) AS VARCHAR2(9) ) ),
  id_year        NUMBER(5,0)
                 GENERATED ALWAYS AS ( EXTRACT( YEAR FROM "DATE" ) ),
  id_total       NUMBER(1,0)
                 GENERATED ALWAYS AS ( 1 ),
  total          CHAR(5)
                 GENERATED ALWAYS AS ( 'Total' )
);

Note:笔记:

  • You should not name the column DATE as its a keyword and you will need to surround it in double-quotes and use the same case every time you use it.您不应将DATE列命名为其关键字,并且您需要将其用双引号括起来,并且每次使用时都使用相同的大小写。
  • The id_day_of_week is based on the day of the ISO8601 week because relying on TO_CHAR( "DATE", 'D' ) depends on the NLS_TERRITORY setting as to which day of the week is the first day; id_day_of_week是基于 ISO8601 星期的日期,因为依赖于TO_CHAR( "DATE", 'D' )取决于NLS_TERRITORY设置,即第一天是星期几; this way it is independent of any settings.这样它就独立于任何设置。
  • The day_of_week and month columns have a fixed language. day_of_weekmonth列具有固定的语言。
  • It is unclear what id_total and total should contain so these are generated as literal values;目前还不清楚id_totaltotal应该包含什么,因此它们是作为文字值生成的; if you want to have non-static data in these columns then remove the GENERATED... part of the declaration.如果您想在这些列中包含非静态数据,请删除声明的GENERATED...部分。

Then you can populate it using:然后您可以使用以下方法填充它:

INSERT INTO table_name ( "DATE", is_holiday )
SELECT DATE '2004-01-01' + LEVEL - 1, 0
FROM  DUAL
CONNECT BY DATE '2004-01-01' + LEVEL - 1 < DATE '2020-01-01';

And update the holiday dates using an UPDATE statement according to your territory.并根据您的地区使用UPDATE语句更新假期日期。

Then if you do:那么如果你这样做:

SELECT *
FROM   table_name
ORDER BY "DATE" ASC
FETCH FIRST 32 ROWS ONLY;

The output is: output 是:

 ID |身份证 | DATE |日期 | ID_DAY_OF_WEEK | ID_DAY_OF_WEEK | DAY_OF_WEEK | DAY_OF_WEEK | IS_HOLIDAY | IS_HOLIDAY | ID_MONTH | ID_MONTH | MONTH |月 | ID_YEAR | ID_YEAR | ID_TOTAL | ID_TOTAL | TOTAL -: |:-------- |总计 -: |:-------- | -------------: |:---------- | ----------: |:---------- | ---------: | ---------: | -------: |:------- | -------: |:------- | ------: | ------: | -------: |:---- 1 | -------: |:---- 1 | 01-JAN-04 | 04 年 1 月 1 日 | 4 | 4 | THURSDAY |星期四 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 2 |共 2 | 02-JAN-04 | 2004 年 1 月 2 日 | 5 | 5 | FRIDAY |星期五 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 3 |共 3 | 03-JAN-04 | 2004 年 1 月 3 日 | 6 | 6 | SATURDAY |星期六 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 4 |共 4 个 | 04-JAN-04 | 2004 年 1 月 4 日 | 7 | 7 | SUNDAY |星期日 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 5 |共 5 个 | 05-JAN-04 | 04 年 1 月 5 日 | 1 | 1 | MONDAY |星期一 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 6 |共 6 个 | 06-JAN-04 | 04 年 1 月 6 日 | 2 | 2 | TUESDAY |星期二 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 7 |共 7 个 | 07-JAN-04 | 04 年 1 月 7 日 | 3 | 3 | WEDNESDAY |星期三 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 8 |共 8 个 | 08-JAN-04 | 2004 年 1 月 8 日 | 4 | 4 | THURSDAY |星期四 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 9 |共 9 个 | 09-JAN-04 | 04 年 1 月 9 日 | 5 | 5 | FRIDAY |星期五 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 10 |共 10 个 | 10-JAN-04 | 2004 年 1 月 10 日 | 6 | 6 | SATURDAY |星期六 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 11 |共 11 | 11-JAN-04 | 2004 年 1 月 11 日 | 7 | 7 | SUNDAY |星期日 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 12 |共 12 个 | 12-JAN-04 | 2004 年 1 月 12 日 | 1 | 1 | MONDAY |星期一 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 13 |共 13 个 | 13-JAN-04 | 2004 年 1 月 13 日 | 2 | 2 | TUESDAY |星期二 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 14 |共 14 | 14-JAN-04 | 2004 年 1 月 14 日 | 3 | 3 | WEDNESDAY |星期三 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 15 |共 15 个 | 15-JAN-04 | 2004 年 1 月 15 日 | 4 | 4 | THURSDAY |星期四 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 16 |共 16 个 | 16-JAN-04 | 2004 年 1 月 16 日 | 5 | 5 | FRIDAY |星期五 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 17 |共 17 个 | 17-JAN-04 | 2004 年 1 月 17 日 | 6 | 6 | SATURDAY |星期六 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 18 |共 18 个 | 18-JAN-04 | 2004 年 1 月 18 日 | 7 | 7 | SUNDAY |星期日 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 19 |共 19 个 | 19-JAN-04 | 2004 年 1 月 19 日 | 1 | 1 | MONDAY |星期一 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 20 |共 20 | 20-JAN-04 | 04 年 1 月 20 日 | 2 | 2 | TUESDAY |星期二 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 21 |总计 21 | 21-JAN-04 | 2004 年 1 月 21 日 | 3 | 3 | WEDNESDAY |星期三 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 22 |总计 22 | 22-JAN-04 | 2004 年 1 月 22 日 | 4 | 4 | THURSDAY |星期四 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 23 |总计 23 | 23-JAN-04 | 2004 年 1 月 23 日 | 5 | 5 | FRIDAY |星期五 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 24 |总计 24 | 24-JAN-04 | 2004 年 1 月 24 日 | 6 | 6 | SATURDAY |星期六 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 25 |总计 25 | 25-JAN-04 | 2004 年 1 月 25 日 | 7 | 7 | SUNDAY |星期日 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 26 |总计 26 | 26-JAN-04 | 2004 年 1 月 26 日 | 1 | 1 | MONDAY |星期一 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 27 |总计 27 | 27-JAN-04 | 2004 年 1 月 27 日 | 2 | 2 | TUESDAY |星期二 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 28 |总计 28 | 28-JAN-04 | 2004 年 1 月 28 日 | 3 | 3 | WEDNESDAY |星期三 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 29 |总计 29 | 29-JAN-04 | 2004 年 1 月 29 日 | 4 | 4 | THURSDAY |星期四 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 30 |总计 30 | 30-JAN-04 | 2004 年 1 月 30 日 | 5 | 5 | FRIDAY |星期五 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 31 |总计 31 | 31-JAN-04 | 2004 年 1 月 31 日 | 6 | 6 | SATURDAY |星期六 | 0 | 0 | 1 | 1 | JANUARY |一月 | 2004 | 2004 | 1 | 1 | Total 32 |总计 32 | 01-FEB-04 | 2004 年 1 月 1 日 | 7 | 7 | SUNDAY |星期日 | 0 | 0 | 2 | 2 | FEBRUARY |二月 | 2004 | 2004 | 1 | 1 | Total全部的

db<>fiddle here db<> 在这里摆弄

create table date_dim
(id number(38),
date date,
id_dayofweek number(38),
dayofweek varchar(100),
id_holiday number(38),
 id_month number(38),
 month varchar(100),  
 id_year number(38),
 id_total number(38),
 Total varchar(100));

Use above query to create the table.使用上面的查询来创建表。

Regarding the data, you can generate it through connect by clause.关于数据,您可以通过connect by子句生成它。

insert into date_dim
(select level as id, to_date('31-DEC-2003', 'DD-MON-YYYY') + level as date1,   
case when ltrim(rtrim(to_char(to_date('31-DEC-2003', 'DD-MON-YYYY') + level, 'Day'))) = 'Monday' then 2
when ltrim(rtrim(to_char(to_date('31-DEC-2003', 'DD-MON-YYYY') + level, 'Day'))) = 'Tuesday' then 3
when ltrim(rtrim(to_char(to_date('31-DEC-2003', 'DD-MON-YYYY') + level, 'Day'))) = 'Wednesday' then 4
when ltrim(rtrim(to_char(to_date('31-DEC-2003', 'DD-MON-YYYY') + level, 'Day'))) = 'Thursday' then 5
when ltrim(rtrim(to_char(to_date('31-DEC-2003', 'DD-MON-YYYY') + level, 'Day'))) = 'Friday' then 6
when ltrim(rtrim(to_char(to_date('31-DEC-2003', 'DD-MON-YYYY') + level, 'Day'))) = 'Saturday' then 7
when ltrim(rtrim(to_char(to_date('31-DEC-2003', 'DD-MON-YYYY') + level, 'Day'))) = 'Sunday' then 1 end as id_dayofweek,
to_char(to_date('31-DEC-2003', 'DD-MON-YYYY') + level, 'Day') as dayofweek,
0 as id_holiday,
to_char(to_date('31-DEC-2003', 'DD-MON-YYYY') + level, 'MM') as id_month,
to_char(to_date('31-DEC-2003', 'DD-MON-YYYY') + level, 'Month') as month,
to_char(to_date('31-DEC-2003', 'DD-MON-YYYY') + level, 'YYYY') as year,
1 as id_total,
'Total' as Total
from dual
connect by level < = 5844);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM