不要かもしれませんが、DISTINCT ONを使用せず書き換えたクエリを残しておきます。
DISTINCT ONはLIMITのような最終的な取得件数を制限する目的ではなく、例として AAAnullnullBBnullCCCDnullnull という順で属性Aが推移した個体について、nullおよび属性Aが重複するレコードを除外し、ABCDという4件のレコードに整理するために考えたものでした。こうして整理した上で、LAGとLEADで時系列の推移を確認しました。
(AABBnullnullCD -> ABCD、BBCnullBAAnullBCCD -> BCBABCD、など)
推移の間にnullが挟まっても良い点や、2種類のIDの掛け合わせで個体を識別している点(WINDOW句の使用)など、私の説明の足りない点が多かったかと思います。テーブル自体についても情報が足りない中で原因を考えてくださったことは申し訳ありません。
またそもそも当初のクエリでは、たとえDISTINCT ONの対象になるレコードの順序が一定に定まったとしても、BABCDのような推移をした個体がBACDの時系列に整理されるため、ABCDの推移をしているにも関わらず正しく抽出されない初歩的な間違いがありましたので、その修正も含んでいます。まぎらわしい誤解を含む質問でした。ごめんなさい。
SQL
1 CREATE TABLE テーブル 1 (
2 id1 date , id2 varchar , 計測時刻 timestamp without time zone , 属性A varchar , 条件 1 integer
3 ) ;
4 -- id1は計測開始日。id2は計測開始時に再割り当てをする。
5 -- id2は計測開始日が異なると重複するおそれがあるのでid1とかけ合わせて識別する。
6 INSERT INTO テーブル 1
7 VALUES ( '2022-06-01' , '0001' , '2022-06-01 19:30:00' , null , 1 )
8 VALUES ( '2022-06-01' , '0001' , '2022-06-01 20:30:00' , 'A' , 1 )
9 VALUES ( '2022-06-01' , '0001' , '2022-06-01 21:30:00' , 'B' , 1 )
10 VALUES ( '2022-06-01' , '0001' , '2022-06-01 22:30:00' , null , 1 )
11 VALUES ( '2022-06-01' , '0001' , '2022-06-01 23:30:00' , 'C' , 1 )
12 VALUES ( '2022-06-01' , '0001' , '2022-06-02 0:30:00' , null , 1 )
13 VALUES ( '2022-06-01' , '0001' , '2022-06-02 1:30:00' , 'D' , 1 )
14 VALUES ( '2022-06-03' , '0010' , '2022-06-03 8:30:00' , 'B' , 1 )
15 VALUES ( '2022-06-03' , '0010' , '2022-06-03 9:30:00' , 'A' , 1 )
16 VALUES ( '2022-06-03' , '0010' , '2022-06-03 10:30:00' , 'B' , 1 )
17 VALUES ( '2022-06-03' , '0010' , '2022-06-03 11:30:00' , 'C' , 1 )
18 VALUES ( '2022-06-03' , '0010' , '2022-06-03 12:30:00' , 'D' , 1 )
19 VALUES ( '2022-06-03' , '0010' , '2022-06-03 13:30:00' , null , 1 ) ;
SQL
1 WITH wth AS (
2 SELECT id1 , id2 ,
3 LAG ( 属性A , 2 ) OVER 条件 AS 前 2 ,
4 LAG ( 属性A , 1 ) OVER 条件 AS 前 1 ,
5 属性A ,
6 LEAD ( 属性A , 1 ) OVER 条件 AS 後 1
7 FROM (
8 SELECT * FROM (
9 SELECT id1 , id2 , 属性A , 属性A IS DISTINCT FROM LAG ( 属性A ) OVER 条件 AS ここで変化 , 計測時刻
10 FROM テーブル 1
11 WHERE 条件 1 = 1
12 AND 属性A is not null
13 AND 計測時刻:: time >= time '8:00:00' AND 計測時刻:: time < time '20:00:00'
14 WINDOW 条件 AS ( PARTITION BY id1 , id2 ORDER BY id1 ASC , id2 ASC , 計測時刻 ASC )
15 ) sb1
16 WHERE ここで変化 = TRUE
17 ) sb2
18 WINDOW 条件 AS ( PARTITION BY id1 , id2 ORDER BY id1 ASC , id2 ASC , 計測時刻 ASC )
19 )
20 SELECT * FROM wth
21 WHERE 前 2 = 'A' AND 前 1 = 'B' AND 属性A = 'C' AND 後 1 = 'D'