sql >> データベース >  >> RDS >> Oracle

増分列を作成するにはどうすればよいですか?

    1日あたりの列を作成しようとしないでください。場所、日付、および各統計(感染、回復、死亡など)の列を含むテーブルを作成し、それらをピボットする必要がある場合は、クエリ(または中間層アプリケーション[PHP、 Java、.net]データベースへのアクセスに使用しています。

    次のようなもの:

    CREATE TABLE Regions(
      id        VARCHAR2(6)
                CONSTRAINT regions__id__pk PRIMARY KEY,
      parent_id VARCHAR2(6)
                CONSTRAINT regions_parent__fk REFERENCES Regions ( id ),
      name      VARCHAR2(50)
                CONSTRAINT regions__name__nn NOT NULL
                CONSTRAINT regions__name__u UNIQUE,
      latitude  NUMBER
                CONSTRAINT regions__lat__nn NOT NULL,
      longitude NUMBER
                CONSTRAINT regions__long__nn NOT NULL,
      CONSTRAINT regions__id__chk CHECK (
           ( parent_id IS     NULL AND REGEXP_LIKE( id, '^[A-Z]{2}$' ) )
        OR ( parent_id IS NOT NULL AND REGEXP_LIKE( id, '^[A-Z]{2}-[A-Z0-9]{1,3}$' ) )
      )
    );
    COMMENT ON COLUMN Regions.id        IS 'ISO 3166-2 Alpha-2 Country Code or ISO 3166-2 Province Code';
    COMMENT ON COLUMN Regions.name      IS 'ISO 3166-2 English Short Name.';
    COMMENT ON COLUMN Regions.latitude  IS 'Latitude of the region''s main city.';
    COMMENT ON COLUMN Regions.longitude IS 'Longitude of the region''s main city.';
    
    CREATE TABLE Virus_Statistics(
      id        NUMBER(20,0)
                GENERATED ALWAYS AS IDENTITY
                CONSTRAINT virus_statistics__id__pk PRIMARY KEY,
      location  VARCHAR2(6)
                CONSTRAINT virus_statistics__loc__nn NOT NULL
                CONSTRAINT virus_statistics__loc__fk REFERENCES Regions ( id ),
      datetime  DATE
                CONSTRAINT virus_statistics__dt__nn NOT NULL
                CONSTRAINT virus_statistics__dt__chk CHECK ( datetime = TRUNC( datetime ) ),
      infected  NUMBER(10,0),
      recovered NUMBER(10,0),
      dead      NUMBER(10,0),
      CONSTRAINT virus_statistics__loc__dt__u UNIQUE ( location, datetime )
    );
    

    次に、データを入力できます。たとえば、地域は次のようになります。

    INSERT INTO Regions ( id, parent_id, name, latitude, longitude )
    SELECT 'TH',    NULL, 'Thailand',          15.00000,  101.00000 FROM DUAL UNION ALL
    SELECT 'JP',    NULL, 'Japan',             36.00000,  138.00000 FROM DUAL UNION ALL
    SELECT 'SG',    NULL, 'Singapore',          1.28333,  103.83333 FROM DUAL UNION ALL
    SELECT 'NP',    NULL, 'Nepal',             28.16667,   84.25000 FROM DUAL UNION ALL
    SELECT 'MY',    NULL, 'Malaysia',           2.50000,  112.50000 FROM DUAL UNION ALL
    SELECT 'CA',    NULL, 'Canada',            45.42472, - 75.69500 FROM DUAL UNION ALL
    SELECT 'CA-BC', 'CA', 'British Columbia',  48.40733, -123.32977 FROM DUAL;
    

    また、データの最初の3列は次のようになります。

    INSERT INTO Virus_Statistics ( location, datetime, infected, recovered, dead )
    SELECT 'TH',    DATE '2020-01-22', 2 AS i, 0 AS r, 0 AS d FROM DUAL UNION ALL
    SELECT 'TH',    DATE '2020-01-23', 3, 0, 0 FROM DUAL UNION ALL
    SELECT 'TH',    DATE '2020-01-24', 5, 0, 0 FROM DUAL UNION ALL
    SELECT 'JP',    DATE '2020-01-22', 2, 0, 0 FROM DUAL UNION ALL
    SELECT 'JP',    DATE '2020-01-23', 1, 0, 0 FROM DUAL UNION ALL
    SELECT 'JP',    DATE '2020-01-24', 2, 0, 0 FROM DUAL UNION ALL
    SELECT 'SG',    DATE '2020-01-22', 0, 0, 0 FROM DUAL UNION ALL
    SELECT 'SG',    DATE '2020-01-23', 1, 0, 0 FROM DUAL UNION ALL
    SELECT 'SG',    DATE '2020-01-24', 3, 0, 0 FROM DUAL UNION ALL
    SELECT 'NP',    DATE '2020-01-22', 0, 0, 0 FROM DUAL UNION ALL
    SELECT 'NP',    DATE '2020-01-23', 0, 0, 0 FROM DUAL UNION ALL
    SELECT 'NP',    DATE '2020-01-24', 0, 0, 0 FROM DUAL UNION ALL
    SELECT 'MY',    DATE '2020-01-22', 0, 0, 0 FROM DUAL UNION ALL
    SELECT 'MY',    DATE '2020-01-23', 0, 0, 0 FROM DUAL UNION ALL
    SELECT 'MY',    DATE '2020-01-24', 0, 0, 0 FROM DUAL UNION ALL
    SELECT 'CA-BC', DATE '2020-01-22', 0, 0, 0 FROM DUAL UNION ALL
    SELECT 'CA-BC', DATE '2020-01-23', 0, 0, 0 FROM DUAL UNION ALL
    SELECT 'CA-BC', DATE '2020-01-24', 0, 0, 0 FROM DUAL;
    

    次に、それを1日あたりの列数として出力する場合は、PIVOTを使用します。 :

    SELECT *
    FROM   (
      SELECT name,
             latitude,
             longitude,
             datetime,
             infected
      FROM   Virus_Statistics v
             INNER JOIN Regions r
             ON ( r.id = v.location )
    )
    PIVOT (
      MAX( infected )
      FOR datetime IN (
        DATE '2020-01-22' AS "2020-01-22",
        DATE '2020-01-23' AS "2020-01-23",
        DATE '2020-01-24' AS "2020-01-24"
      )
    )
    

    どの出力:

    db <> fiddle こちら




    1. データベースとファイルシステムへのファイルの保存

    2. MySQLはCSVデータからNULL値をロードします

    3. アクティブなレコードを使用するときにcodeigniterのバッククォートを無視するにはどうすればよいですか?ケースごとに注文する必要があります

    4. KubernetesでのヘルパーコンテナとしてのProxySQLの実行