1

我需要在 oracle 中创建一个新表,其中只有每条记录的最新日期(步骤 1),并计算之间的天数(步骤 2)。

非常感谢您的建议:)))

第 1 步:首先我需要从表 USERS 中找到每条记录的最大值(Mod_date)。

表:用户

名称......Mod_Date

杰森·马丁....... 25-JUL-89

艾尔马修斯............ 89 年 3 月 21 日

詹姆斯史密斯............ 88 年 12 月 12 日

罗伯特·布莱克....... 84 年 1 月 15 日

杰森·马丁....... 25-JUL-99

阿尔马修斯............ 96 年 3 月 21 日

詹姆斯史密斯............ 98 年 12 月 12 日

罗伯特·布莱克....... 94 年 1 月 15 日

*TABLE_DESIRED_RESULTS_step1

名称...... Max(Mod_Date)

杰森·马丁....... 25-JUL-99

阿尔马修斯............ 96 年 3 月 21 日

詹姆斯史密斯............12-DEC-98

罗伯特·布莱克.......15-JAN-94

第 2 步:计算“Regist_Date 和 Mod_Date 之间的天数”并将其添加到表中。

表:注册

名称.......Regist_Date

杰森·马丁............20-JUL-99

阿尔马修斯............23-MAR-96

罗伯特·布莱克............20-JAN-94

*TABLE_DESIRED_RESULTS_step2

名称......Max(Mod_Date)......Regist_Date 和 Mod_Date 之间的天数

杰森·马丁...... 25-JUL-99........5

艾尔马修斯............ 21-MAR-96............-2

詹姆斯·史密斯....... 98 年 12 月 12 日............空

罗伯特·布莱克...... 94 年 1 月 15 日............-5

*请注意,这些数据是组成的,我已经有现有的联合和连接,我必须添加这个逻辑。感谢,并有一个愉快的一天!

4

1 回答 1

0

这是我用示例更新的答案。

重要的是您的日期列具有 DATE类型。这是遵循您的规范的表格和数据。

CREATE TABLE USERS
   (
    ID_USER NUMBER(6)  NOT NULL,
    NAME VARCHAR2(64)  NOT NULL,
    MOD_DATE DATE  NOT NULL,
    CONSTRAINT PK_user PRIMARY KEY (ID_USER)
   ) ;

    INSERT INTO USERS VALUES (1,'Jason Martin',TO_DATE('25-07-1989','DD-MM-YYYY'));
    INSERT INTO USERS VALUES (2,'Al Mathews',TO_DATE('21-03-1989','DD-MM-YYYY'));
    INSERT INTO USERS VALUES (3,'James Smith',TO_DATE('12-12-1988','DD-MM-YYYY'));
    INSERT INTO USERS VALUES (4,'Robert Black',TO_DATE('15-01-1984','DD-MM-YYYY'));
    INSERT INTO USERS VALUES (5,'Jason Martin',TO_DATE('25-07-1999','DD-MM-YYYY'));
    INSERT INTO USERS VALUES (6,'Al Mathews',TO_DATE('21-03-1996','DD-MM-YYYY'));
    INSERT INTO USERS VALUES (7,'James Smith',TO_DATE('12-12-1998','DD-MM-YYYY'));
    INSERT INTO USERS VALUES (8,'Robert Black',TO_DATE('15-01-1994','DD-MM-YYYY'));


CREATE TABLE REGISTRATION
   (
    ID_REG NUMBER(6)  NOT NULL,
    NAME VARCHAR2(64)  NOT NULL,
    REGIST_DATE DATE  NOT NULL,
    CONSTRAINT PK_reg PRIMARY KEY (ID_REG)
   ) ;

    INSERT INTO REGISTRATION VALUES (1,'Jason Martin',TO_DATE('20-07-1999','DD-MM-YYYY'));
    INSERT INTO REGISTRATION VALUES (2,'Al Mathews',TO_DATE('23-03-1996','DD-MM-YYYY'));
    INSERT INTO REGISTRATION VALUES (3,'Robert Black',TO_DATE('20-01-1994','DD-MM-YYYY'));

第一步

   CREATE  TABLE TABLE_DESIRED_RESULTS_step1
   AS ( 
   SELECT
         u.NAME
        , max(u.MOD_DATE) as "maxi"
       FROM USERS u
       GROUP BY u.NAME);

第二步

CREATE TABLE TABLE_DESIRED_RESULTS_step2 
AS (
SELECT 
    t.NAME 
    ,t."maxi"
    , (t."maxi" - r.REGIST_DATE ) as "Nbdays bw RegD and Mod_D"
FROM TABLE_DESIRED_RESULTS_step1 t LEFT OUTER JOIN REGISTRATION r 
ON t.NAME = r.NAME);

这里的技巧是,LEFT OUTER JOIN如果与连接不匹配,则允许空值。


但是我有一个数据库设计问题。如果您有 2 个用户具有完全相同的名称,您将 2 人合二为一。这是一个使用 ID 并在 ID 上进行连接的解决方案。

CREATE TABLE USERS
   (
    ID_USER NUMBER(6)  NOT NULL,
    NAME VARCHAR2(64)  NOT NULL,
    CONSTRAINT PK_user PRIMARY KEY (ID_USER)
   ) ; 

CREATE TABLE MOD_USERS
   (
    ID_MOD NUMBER(6)  NOT NULL,
    ID_USER NUMBER(6)  NOT NULL,
    CONSTRAINT PK_usermod PRIMARY KEY (ID_MOD)
   ) ; 

ALTER TABLE MOD_USERS ADD (
     CONSTRAINT FK_user_mod
          FOREIGN KEY (ID_USER)
               REFERENCES USERS (ID_USER));

CREATE TABLE REGISTRATION
   (
    ID_REG NUMBER(6)  NOT NULL,
    ID_USER VARCHAR2(64)  NOT NULL,
    REGIST_DATE DATE  NOT NULL,
    CONSTRAINT PK_reg PRIMARY KEY (ID_REG)
   ) ;

ALTER TABLE REGISTRATION ADD (
     CONSTRAINT FK_user_reg
          FOREIGN KEY (ID_USER)
               REFERENCES USERS (ID_USER))

;

第一步

   CREATE  TABLE TABLE_DESIRED_RESULTS_step1
   AS ( 
   SELECT
         m.ID_USER , u.NAME
        , max(u.MOD_DATE) as "maxi"
       FROM USERS u INNER JOIN MOD_USERS m
           ON u.ID_USER = m.ID_USER
       GROUP BY m.ID_USER , u.NAME);

第二步

CREATE TABLE TABLE_DESIRED_RESULTS_step2 
AS (
SELECT 
    t.ID_USER , t.NAME 
    ,t."maxi"
    , (t."maxi" - r.REGIST_DATE ) as "Nbdays bw RegD and Mod_D"
FROM TABLE_DESIRED_RESULTS_step1 t LEFT OUTER JOIN REGISTRATION r 
ON t.ID_USER = r.ID_USER);
于 2011-04-20T21:37:16.977 回答