更新1:これがフィドルです。
更新2:これがフィドルです。
更新3:何らかの理由で、前日がない場合は正しく処理されていませんでした。そうだと思いました。ただし、動作することを確認するために更新しました(少し面倒ですが、正しいようです。最後のフィドル: http://sqlfiddle.com/#!2/3f78d/45
@Grijeshは、入力データの自己結合を介して、概念的に必要な主なものを取得したと思います(したがって、必ず彼の回答に投票してください!)。私は彼のクエリを構文について少しクリーンアップしました(彼のクエリから構築しました!):
SELECT
DATE(t1.`Production_date`) as theDate,
MAX( t1.`bundle_count` ) AS 'max(bundle_count)',
MAX( t1.`bundle_count` ) -
IF(
EXISTS
(
SELECT date(t2.production_date)
FROM input_example t2
WHERE t2.machine_no = 1 AND
date_sub(date(t1.production_date), interval 1 day) = date(t2.production_date)
),
(
SELECT MAX(t3.bundle_count)
FROM input_example t3
WHERE t3.machine_no = 1 AND
date_sub(date(t1.production_date), interval 1 day) = date(t3.production_date)
GROUP BY DATE(t3.production_date)
), 0
)
AS Total_Bundles_Used
FROM `input_example` t1
WHERE t1.machine_no = 1
GROUP BY DATE( t1.`production_date` )
注1:@Grijeshと私は、クエリ構文の問題を同時にクリーンアップしていたと思います。両方ともクリーンアップを行った後、非常に類似したバージョンになってしまったことは心強いことです。私のバージョンは、IFNULL()
の使用が異なります 先行データがない場合。また、DATE_SUB
になりました 、およびDATE()
を使用して、さまざまな日付を時間コンポーネントのない単なる日付に減らすようにしました。
注2:元々、ソーステーブルを完全に理解していなかったため、クエリに実行カウントを実装する必要があると思いました。しかし、よく調べてみると、ソースデータにすでに実行カウントがあることが明らかなので、そのデータを元に戻しました。