注:
- 数式が実際にExcelで機能する場合は、時刻ではなく日付をセルに保存しているよりも。
-
D, E
の場合 、前の行に同じラベルがない場合に、これが「yes」を返す方法がわかりません - IDの列をテーブルに追加する必要があります(!)。 Excelはシート内の行の同じ順序を保持しますが(明示的に変更しない限り)、PostgreSQLは保持しません。したがって、実際に列の時間が限られている場合は、テーブルと同じ行の順序を取得する方法がないため、完全に誤った結果になります。
- バージョン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
説明:
lag
関数は、指定されたパーティションの前の行の値を取得します。この場合、パーティションはラベルによって定義されます。- キャスト演算子
::
time
を変更しますinterval
に入力します 、時間を追加して24時間以上取得できるようにします。 - 合計を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