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

PostgreSQL-基準に基づいて各行に値を割り当てます

    注:

    1. 数式が実際にExcelで機能する場合は、時刻ではなく日付をセルに保存しているよりも。
    2. D, Eの場合 、前の行に同じラベルがない場合に、これが「yes」を返す方法がわかりません
    3. IDの列をテーブルに追加する必要があります(!)。 Excelはシート内の行の同じ順序を保持しますが(明示的に変更しない限り)、PostgreSQLは保持しません。したがって、実際に列の時間が限られている場合は、テーブルと同じ行の順序を取得する方法がないため、完全に誤った結果になります。
    4. バージョン8.4を使用している場合、リンクは正しいですが、現在のドキュメント

    データ:

    drop table if exists tmp.test;
    
    create table tmp.test (id int, ddate date, label varchar, ttime time);
    
    insert into tmp.test values
    
    (1, '2014/6/4','A','12:05:56'),
    (2, '2014/6/4','A','23:02:32'),
    (3, '2014/6/4','B','8:39:25'),
    (4, '2014/6/4','B','12:36:37'),
    (5, '2014/6/4','C','12:20:43'),
    (6, '2014/6/4','C','12:56:44'),
    (7, '2014/6/4','D','20:52:22'),
    (8, '2014/6/4','E','22:25:30'),
    (9, '2014/6/4','F','12:16:15'),
    (10, '2014/6/4','F','12:31:09'),
    (11, '2014/6/4','F','7:12:06'),
    (12, '2014/6/4','G','7:48:32'),
    (13, '2014/6/4','H','17:58:11');
    

    クエリ:

    select
      id, 
      ddate,
      label,
      ttime,
      case when (lag(ttime) over(partition by label order by id))::interval
            + ttime::interval > interval '24 hours' then 'yes' else 'no' end
      -- ,(lag(ttime) over(partition by label order by ttime))::interval + ttime::interval
    from
      tmp.test
    

    説明:

    1. lag 関数は、指定されたパーティションの前の行の値を取得します。この場合、パーティションはラベルによって定義されます。
    2. キャスト演算子:: timeを変更します intervalに入力します 、時間を追加して24時間以上取得できるようにします。
    3. 合計を24時間間隔と比較し、素敵なラベルを表示しますyes またはno

    更新:

    select
      id, 
      ddate,
      label,
      ttime,
      case when lead(label) over(partition by label order by id) is null then 'no' else 'yes' end
    from
      tmp.test
    



    1. MySQLの照合の違法な組み合わせ

    2. While(rs.next())ステートメントが最初の反復後に終了するのはなぜですか?

    3. doctrineを使用したsymfony2はリモートmysqlデータベースに接続できません

    4. OracleのJSON_OBJECT()関数