तो आप चाहते हैं:
- उपनाम
C
किसी दिए गए दिन के लिए समूह में सभी पंक्तियों के अनुरूप होने के लिए, ताकि आपMAX()
. का उपयोग कर सकें औरMIN()
उस समूह की पंक्तियों के ऊपर। - उपनाम
C2
किसी दिए गए दिन में अंतिम पंक्ति के अनुरूप होने के लिए। - उपनाम
C3
C2
. के बाद की पंक्ति के अनुरूप होने के लिए उसी दिन। यदि कोई नहीं मिलता है, अर्थातC3.*
NULL है, तोC2
उस दिन का नवीनतम है।
इसे अक्सर greatest-n-per-group
. का लेबल दिया जाता है क्वेरी, और यह अक्सर स्टैक ओवरफ़्लो पर आता है। यहां एक समाधान है जिसका मैंने आपके परीक्षण डेटा के लिए परीक्षण किया है, लेकिन आप अन्य समाधानों और चर्चा के लिए मेरे द्वारा आपके प्रश्न में जोड़े गए टैग का अनुसरण कर सकते हैं।
संपादित करें: मैं शुरुआती कीमत और बंद कीमत दोनों की आवश्यकता से चूक गया। निम्नलिखित संपादित किया गया है।
SELECT DATE_FORMAT(C.`DTE`, '%m/%d/%Y') AS trading_day,
MIN(C.`PRICE`) AS min_price,
MAX(C.`PRICE`) AS max_price,
Copen.`PRICE` AS opening_price,
Cclose.`PRICE` AS closing_price
FROM `CHART_DATA` AS C
INNER JOIN `CHART_DATA` AS Cclose
ON DAY(C.`DTE`) = DAY(Cclose.`DTE`)
LEFT OUTER JOIN `CHART_DATA` AS Cclose_later
ON DAY(C.`DTE`) = DAY(Cclose_later.`DTE`) AND Cclose.`DTE` < Cclose_later.`DTE`
INNER JOIN `CHART_DATA` AS Copen
ON DAY(C.`DTE`) = DAY(Copen.`DTE`)
LEFT OUTER JOIN `CHART_DATA` AS Copen_earlier
ON DAY(C.`DTE`) = DAY(Copen_earlier.`DTE`) AND Copen.`DTE` < Copen_earlier.`DTE`
WHERE Cclose_later.`DTE` IS NULL AND Copen_earlier .`DTE` IS NULL
GROUP BY trading_day;