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

SQL-不完全な組み合わせ

    テーブルとサンプル日付を作成します

    SQL> create table observation(
      2    item_id number,
      3    dt      date,
      4    val1    number,
      5    val2    number );
    
    Table created.
    
    SQL> insert into observation values( 1, date '2011-12-01', 1, null );
    
    1 row created.
    
    SQL> insert into observation values( 1, date '2011-12-02', null, 2 );
    
    1 row created.
    
    SQL> insert into observation values( 1, date '2011-12-03', 3, null );
    
    1 row created.
    
    SQL> insert into observation values( 2, date '2011-12-01', 4, null );
    
    1 row created.
    
    SQL> insert into observation values( 2, date '2011-12-02', 5, 6 );
    
    1 row created.
    

    次に、KEEPを使用します MAXの句 ORDER BYを使用した集計関数 これにより、観測値がNULLの行が最後に配置されます。 ORDER BYで使用する日付 表の最初の実際の観察よりも早くする必要があります。

    SQL> ed
    Wrote file afiedt.buf
    
      1  select item_id,
      2         max(val1) keep( dense_rank last
      3                              order by (case when val1 is not null
      4                                             then dt
      5                                             else date '1900-01-01'
      6                                          end) ) val1,
      7         max(val2) keep( dense_rank last
      8                              order by (case when val2 is not null
      9                                             then dt
     10                                             else date '1900-01-01'
     11                                          end) ) val2
     12    from observation
     13*  group by item_id
    SQL> /
    
       ITEM_ID       VAL1       VAL2
    ---------- ---------- ----------
             1          3          2
             2          5          6
    

    CASEを追加するよりも、NULL値を無視するより洗練された解決策があると思います。 ORDER BYへのステートメント しかし、CASE 仕事を成し遂げます。



    1. 日付形式にLOADDATAINFILEを使用する複数のSETフィールド

    2. 1つのステートメントで複数の(3+)テーブルを結合する方法

    3. Postgresqlでの外部キーのインデックス作成

    4. SQLで2つの列でグループ化する方法