MYSQL SELECTクエリで複数の行を組み合わせます

ガース・ターナー:

最初の質問はここに、私は明確にするために私の全力を尽くします。

私は2つのテーブルを持っています:

  1. 各証券コードと属性のリストのレコードが含まれています「TABLE1」。表1に、各stock_codeのためのちょうど1つのレコードがあります
  2. 時間をかけて、製品の属性への変更のログを含む「TABLE2」。

「TABLE2」は、以下のフィールドが含まれています:。

  1. stock_code
  2. stock_attribute
  3. OLD_VALUE
  4. NEW_VALUE
  5. 変更日
  6. 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:

あなたは、次の操作を実行できます。

  1. 各「週」の最大の日付を検索
  2. これらの日付に対応する行を探します
  3. 列に行を変換するために、条件付きの集約を使用します

ここでは、コードの大まかな概要です。今日は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

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=21404&siteId=1