前提・実現したいこと
SQLで、以下のようなテーブルから、合格した製品の数を求めようとしています。
<列の説明>
・productは、製品のidです。
・orderは、productのうちで最初に作った製品が1、次の製品が2となります。
(productが変わった場合、orderは再度1から始まります)
・timeは、判定した時刻です
・okは、trueが合格、falseが不合格です
・machineは判定装置のidです。1と2があります。
<データの説明>
・一つの製品につき2回検査があります。
・2回とも結果がtrueなら合格です。
・「productとorderが同じでtimeも同じ」または「productとorderが同じでtimeのずれが1秒」なら同じ製品です。
・1と2の検査の順番は決まってません。
<テーブル>
product|order|time|ok|machine
|:--|:--:|--:|--:|
1|1|2018-09-10 12:00:00|true|1
1|1|2018-09-10 12:00:01|false|2
1|2|2018-09-10 12:00:09|true|2
1|2|2018-09-10 12:00:10|true|1
1|3|2018-09-10 12:00:20|false|2
1|3|2018-09-10 12:00:20|true|1
2|1|2018-09-10 12:00:35|false|1
2|1|2018-09-10 12:00:35|true|2
1|1|2018-09-11 12:00:00|false|1
1|1|2018-09-11 12:00:00|false|2
<出力したいデータ>
|合格数|
|1|
発生している問題
以下が、作成したSQLです。
SELECT count(*) FROM( SELECT order FROM table GROUP BY product,order,time HAVING SUM(CASE is_ok WHEN 'true' THEN 1 WHEN 'false' THEN 0 END) in (2))as t1 )
「GROUP BY」で製品ごとのレコードを抽出し、「HANING」で2回とも結果がtrueのレコードを抽出しています。
しかし、これでは『「orderが同じでtimeのずれが1秒程度」なら同じ製品』という条件を実現できてません。
どのようにSQLを書けばいいでしょうか。
補足情報(FW/ツールのバージョンなど)
PostgreSQL10を使ってます。
回答4件
あなたの回答
tips
プレビュー