मैं लेनदेन के साथ एक मेज है:एसक्यूएल: चयन लेनदेन जहां पंक्तियों में एक ही तालिका के अंदर मानदंडों में से नहीं हैं
Transactions
------------
id | account | type | date_time | amount
----------------------------------------------------
1 | 001 | 'R' | '2012-01-01 10:01:00' | 1000
2 | 003 | 'R' | '2012-01-02 12:53:10' | 1500
3 | 003 | 'A' | '2012-01-03 13:10:01' | -1500
4 | 002 | 'R' | '2012-01-03 17:56:00' | 2000
5 | 001 | 'R' | '2012-01-04 12:30:01' | 1000
6 | 002 | 'A' | '2012-01-04 13:23:01' | -2000
7 | 003 | 'R' | '2012-01-04 15:13:10' | 3000
8 | 003 | 'R' | '2012-01-05 12:12:00' | 1250
9 | 003 | 'A' | '2012-01-06 17:24:01' | -1250
और मैं निश्चित प्रकार ('आर') का चयन करना चाहते हैं, लेकिन उन नहीं है कि immediatly दायर एक ही खाते के लिए एक और प्रकार ('ए') का एक और लेन-देन है (DATE_TIME क्षेत्र के क्रम में) ...
तो, क्वेरी निम्न पंक्तियों फेंक चाहिए, पिछले उदाहरण दिया:
id | account |type | date | amount
----------------------------------------------------
1 | 001 | 'R' | '2012-01-01 10:01:00' | 1000
5 | 001 | 'R' | '2012-01-04 12:30:01' | 1000
7 | 003 | 'R' | '2012-01-04 15:13:10' | 3000
(जैसा कि आप देख सकते हैं, पंक्ति 2 प्रदर्शित नहीं होती है क्योंकि पंक्ति 3 'इसे रद्द करता है' ... पंक्ति 4 द्वारा पंक्ति 4 'रद्द' भी होती है; पंक्ति 7 प्रकट होता है (भले ही खाता 003 रद्द पंक्ति # 2 से संबंधित है, इस बार पंक्ति 7 में यह किसी भी 'ए' पंक्ति द्वारा रद्द नहीं किया गया है); और पंक्ति 8 दिखाई नहीं देगी (यह 003 खाते के लिए भी है क्योंकि अब यह 9 तक रद्द कर दिया गया है, जो 7 को भी रद्द नहीं करता है, केवल पूर्ववर्ती व्यक्ति: 8 ...
मैंने जॉइन, सबक्वायरीज़ में शामिल होने का प्रयास किया है कहाँ खंड लेकिन मैं सच में यकीन है कि कैसे मैं अपने प्रश्न करना चाहिए नहीं हूँ ...
मैं क्या कोशिश की है:
कोशिश कर रहा मिलती है:
SELECT trans.type as type,
trans.amount as amount,
trans.date_time as dt,
trans.account as acct,
FROM Transactions trans
INNER JOIN (SELECT t.type AS type, t.acct AS acct, t.date_time AS date_time
FROM Transactions t
WHERE t.date_time > trans.date_time
ORDER BY t.date_time DESC
) AS nextTrans
ON nextTrans.acct = trans.acct
WHERE trans.type IN ('R')
AND nextTrans.type NOT IN ('A')
ORDER BY DATE(trans.date_time) ASC
यह एक त्रुटि फेंकता है, के बाद से मैं यह कर सकते हैं MySQL में जॉइन को बाहरी मान लागू नहीं करें।
जहां मेंकोशिश कर रहा सबक्वेरी:
SELECT trans.type as type,
trans.amount as amount,
trans.date_time as dt,
trans.account as acct,
FROM Transactions trans
WHERE trans.type IN ('R')
AND trans.datetime <
(SELECT t.date_time AS date_time
FROM Transactions t
WHERE t.account = trans.account
ORDER BY t.date_time DESC
) AS nextTrans
ON nextTrans.acct = trans.acct
ORDER BY DATE(trans.date_time) ASC
यह गलत है, मैं MySQL में कहां के लिए बाहरी मान लागू करने के लिए प्राप्त कर सकते हैं, लेकिन मैं जिस तरह से मैं क्या जरूरत के लिए सही ढंग से फिल्टर करने के लिए खोजने के लिए प्रबंधित नहीं कर सकते ...
महत्वपूर्ण संपादन:
मैं एक समाधान प्राप्त करने में कामयाब रहा, लेकिन अब इसे गंभीर अनुकूलन की आवश्यकता है। संदेश यह है:
SELECT *
FROM (SELECT t1.*, tFlagged.id AS cancId, tFlagged.type AS cancFlag
FROM transactions t1
LEFT JOIN (SELECT t2.*
FROM transactions t2
ORDER BY t2.date_time ASC) tFlagged
ON (t1.account=tFlagged.account
AND
t1.date_time < tFlagged.date_time)
WHERE t1.type = 'R'
GROUP BY t1.id) tCanc
WHERE tCanc.cancFlag IS NULL
OR tCanc.cancFlag <> 'A'
मैं खुद के साथ तालिका में शामिल हो गए, बस एक ही खाते और महान DATE_TIME पर विचार। जॉइन डेटटाइम द्वारा आदेश दिया जाता है। आईडी द्वारा ग्रुपिंग मैं केवल शामिल होने का पहला परिणाम प्राप्त करने में कामयाब रहा, जो एक ही खाते के लिए अगला लेनदेन होता है।
फिर बाहरी चयन पर, मैं उन लोगों को फ़िल्टर करता हूं जिनके पास 'ए' है, क्योंकि इसका मतलब है कि अगला लेनदेन प्रभावी रूप से इसके लिए रद्द कर दिया गया था। दूसरे शब्दों में, यदि एक ही खाते के लिए कोई अगला लेनदेन नहीं है या यदि अगला लेनदेन 'आर' है, तो इसे रद्द नहीं किया गया है और इसे परिणाम में दिखाया जाना चाहिए ...
मुझे यह मिला:
+----+---------+------+---------------------+--------+--------+----------+
| id | account | type | date_time | amount | cancId | cancFlag |
+----+---------+------+---------------------+--------+--------+----------+
| 1 | 001 | R | 2012-01-01 10:01:00 | 1000 | 5 | R |
| 5 | 001 | R | 2012-01-04 12:30:01 | 1000 | NULL | NULL |
| 7 | 003 | R | 2012-01-04 15:13:10 | 3000 | 8 | R |
+----+---------+------+---------------------+--------+--------+----------+
यह प्रत्येक लेनदेन को एक ही खाते के लिए अगली बार संबंधित करता है और फिर रद्द कर दिया गया है ... सफलता !!
जैसा कि मैंने कहा, समस्या अब अनुकूलन है। मेरे वास्तविक डेटा में बहुत सारी पंक्तियां हैं (जैसे समय के साथ लेन-देन वाले लेन-देन की मेजबानी की उम्मीद है), और अभी ~ 10,000 पंक्तियों की एक तालिका के लिए, मुझे 1min.44sec में इस क्वेरी के साथ सकारात्मक परिणाम मिला। मुझे लगता है कि इसमें शामिल होने वाली बात है ... (उन लोगों के लिए जो यहां प्रोटोकॉल को जानते हैं, मुझे क्या करना चाहिए? यहां एक नया प्रश्न लॉन्च करें और इसे इस समाधान के रूप में पोस्ट करें?? या बस यहाँ और अधिक जवाब के लिए इंतजार)
जो आपने कोशिश की है उसे पोस्ट करें। –
वहाँ है ... –
देखें: http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from-posts –