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

PostgreSQL、カスタムアグリゲート

    コメントで、1つのコードに同じ日付の2つの行を含めることができるとおっしゃいました。つまり、これは正気のデータです。

    01.01.2014  1   3.50
    01.01.2014  1  17.25
    01.01.2014  1  99.34
    

    コードと「日付」で並べ替えたとしても、これらの行のどれが「最後」の行であるかを決定論的に判断する方法はありません。 (リレーショナルモデル(数学セットに基づくモデル)では、列の順序は無関係であり、行の順序は無関係です。)クエリオプティマイザーは行を自由に返すことが最善の方法であるため、このクエリ

    select *
    from temp1
    order by mydate, code
    

    1回の実行でこれを返す可能性があります

    01.01.2014  1   3.50
    01.01.2014  1  17.25
    01.01.2014  1  99.34
    

    そしてこれは別のものです。

    01.01.2014  1   3.50
    01.01.2014  1  99.34
    01.01.2014  1  17.25
    

    最後の意味を表す値を保存しない限り 明らかに、あなたがやろうとしていることは不可能です。人々が最後にする必要があるとき 明らかに、彼らは通常タイムスタンプを使用します。

    変更後、このクエリは探しているものを返すようです。

    with distinct_codes as (
      select distinct code 
      from temp1
    ),
    corrected_table as (
    select 
      case when mydate <> '' then TO_TIMESTAMP(mydate, 'DD.MM.YYYY HH24:MI:SS')
           else null
      end as mydate, 
      code, 
      price
    from temp1
    ),
    max_dates as (
      select code, max(mydate) max_date
      from corrected_table
      group by code
    )
    select c1.mydate, d1.code, coalesce(c1.price, 0)
    from corrected_table c1
    inner join max_dates m1
            on m1.code = c1.code
           and m1.max_date = c1.mydate
    right join distinct_codes d1
            on d1.code = c1.code
    order by code;
    



    1. phpを使用してmysqlデータベースに複数の行を挿入するための最良の方法は何ですか?

    2. nhibernate、sysrefcursorを返すOracleの関数を呼び出す

    3. python、sqlalchemy、およびpsycopg2を使用してPostgreSQLデータベースを作成するときにエラーが発生しました

    4. Oracleステートメント