ガース・ターナー:
最初の質問はここに、私は明確にするために私の全力を尽くします。
私は2つのテーブルを持っています:
- 各証券コードと属性のリストのレコードが含まれています「TABLE1」。表1に、各stock_codeのためのちょうど1つのレコードがあります
- 時間をかけて、製品の属性への変更のログを含む「TABLE2」。
「TABLE2」は、以下のフィールドが含まれています:。
- stock_code
- stock_attribute
- OLD_VALUE
- NEW_VALUE
- 変更日
- CHANGE_TIME
表2は、各stock_code OFR複数のエントリを持っています。
在庫項目が変更されるたびに、別のエントリが変更された属性、変更日付、時間、古い値と新しい値で、表2に作られています。
私は、各フィールドの値は、そのための最後に記録された「new_val」であることと、1つの(表1から)各stock_codeのレコード、および一年間毎週の列を持つテーブルになりますクエリを作成したいです週(表2より)
私が試してみました
SELECT a.`stcode`, b.`week1`, b.`week2`, b.`week3`, b.`week4` etc. etc.
from (SELECT stcode, )as a
LEFT JOIN (SELECT stcode,
(CASE WHEN chngdate BETWEEN DATE_SUB(CURDATE(),INTERVAL 363 DAY) AND DATE_SUB(CURDATE(),INTERVAL 357 DAY) THEN newval END)week1,
(CASE WHEN chngdate BETWEEN DATE_SUB(CURDATE(),INTERVAL 356 DAY) AND DATE_SUB(CURDATE(),INTERVAL 350 DAY) THEN newval END)week2,
(CASE WHEN chngdate BETWEEN DATE_SUB(CURDATE(),INTERVAL 349 DAY) AND DATE_SUB(CURDATE(),INTERVAL 343 DAY) THEN newval END)week3,
(CASE WHEN chngdate BETWEEN DATE_SUB(CURDATE(),INTERVAL 342 DAY) AND DATE_SUB(CURDATE(),INTERVAL 336 DAY) THEN newval END)week4,
(etc
etc
etc
FROM (SELECT * from TABLE 2 ORDER BY "chngdate" DESC, "chngtime" DESC )as sub) as b ON b.stcode = s.stcode
ORDER BY stcode ASC
トラブルは、私が得る結果がABC123私はstock_codeのために、例えば.... mutlipleのエントリがありstock_codeための複数の行を取得し、これを使用することです
STCODE WEEK1 WEEK2 WEEK3 WEEK4 WEEK5 WEEK6
abc123 null null 4 null null null
abc123 2 null null null null null
abc123 null null null null 3 null
私が欲しいのはこれです:
STCODE WEEK1 WEEK2 WEEK3 WEEK4 WEEK5 WEEK6
abc123 2 null 4 null 3 null
(52個の派生テーブルがあった!)、それが終了したことがない、私はまた、次のことを試してみましたが、TEHクエリはとても時間がかかりました
SELECT a.`stcode`, w1.`new_value`, w2.`new_value`, w3.`new_value`, w4.`new_value` etc. etc.
from (SELECT stcode, )as a
LEFT JOIN (SELECT stcode,
LEFT JOIN (SELECT stcode, depot, fieldname, chngdate, chngtime, newval from STDepotAmendmentsLog WHERE chngdate BETWEEN DATE_SUB(CURDATE(),INTERVAL 363 DAY) AND DATE_SUB(CURDATE(),INTERVAL 357 DAY) ORDER BY "chngdate" DESC, "chngtime" DESC)as w1 on s.stcode = w1.stcode
etc for week 2, 3, 4 etc etc
サルマンA:
あなたは、次の操作を実行できます。
- 各「週」の最大の日付を検索
- これらの日付に対応する行を探します
- 列に行を変換するために、条件付きの集約を使用します
ここでは、コードの大まかな概要です。今日は2020年3月3日、その後52週である場合、それは2020年2月26日から2020年3月3日にある例えばことを前提としています。必要に応じて調整します。
SELECT t.stock_code
, MAX(CASE WHEN weeknum = 51 THEN new_value END) AS week01
, MAX(CASE WHEN weeknum = 50 THEN new_value END) AS week02
, MAX(CASE WHEN weeknum = 1 THEN new_value END) AS week51
, MAX(CASE WHEN weeknum = 0 THEN new_value END) AS week52
FROM table2 AS t
JOIN (
SELECT stock_code
, DATEDIFF(CURRENT_DATE, change_date) div 7 AS weeknum -- count multiples of 7
, MAX(change_date) AS greatest_date
GROUP BY stock_code, weeknum
FROM table2
) AS a ON t.stock_code = a.stock_code AND t.change_date = a.greatest_date
GROUP BY t.stock_code