/ / एसक्यूएल: मानदंड के आधार पर तालिका से पंक्तियों को कैसे हटाएं - mysql, sql, sql-delete

एसक्यूएल: मानदंड के आधार पर तालिका से पंक्तियों को कैसे हटाएं - mysql, sql, sql-delete

मेरे पास निम्न तालिका है:

tbl
source    type    date
---       ---     ---
google    A       2010-02-25
google    A       2013-04-11
facebook  C       2008-10-22
facebook  C       2007-01-28

मैं प्रत्येक स्रोत की केवल एक प्रविष्टि रखना चाहता हूं, और मानदंड स्रोत टुपल का चयन करता है min(date) group by source। तालिका में लाखों रिकॉर्ड हैं, और मैं अनावश्यक रिकॉर्ड्स को हटाने के लिए एक कुशल तरीका ढूंढ रहा हूं।

उत्तर:

जवाब के लिए 2 № 1

MySQL में, आप इसका उपयोग कर ऐसा कर सकते हैं join:

delete t
from t join
(select source, min(date) as mindate
from t
group by source
) tt
on t.source = tt.source
where t.date > tt.mindate;

एकमात्र तरीका - ऑफ-हाथ - कि मैं इसे और अधिक कुशल बनाने के लिए सोच सकता हूं, एक सबक्वायरी में एकत्रीकरण परिणाम को स्टोर करना और इसमें एक इंडेक्स जोड़ना है।

मैं पंक्तियों को हटाने के लिए गणना करने के लिए गणना के बावजूद भी जोड़ सकता हूं, अक्षम में तालिका में बहुत सारी पंक्तियां हटा रहा हूं। आमतौर पर, मैं एक तीन-चरणीय दृष्टिकोण की सिफारिश करता हूं:

  1. अपनी इच्छित तालिका जेनरेट करने के लिए एक क्वेरी लिखें और परिणामों को एक अस्थायी तालिका में संग्रहीत करें।
  2. मूल तालिका को छोटा करें।
  3. पंक्तियों की (छोटी) छोटी संख्या दोबारा डालें।

जवाब के लिए 0 № 2

माइक्रोसॉफ्ट एसक्यूएल में, आप इसे आजमा सकते हैं।

;
WITH cte
AS (SELECT ROW_NUMBER() OVER (PARTITION BY source, type
ORDER BY createdate) RN
FROM   tbsource)
DELETE FROM cte
WHERE  RN > 1;

जवाब के लिए 0 № 3
delete from t where date not in (select al.d from (select min(date) as d  from t group by source )al);

जवाब के लिए 0 № 4

एक सीरियल नंबर के रूप में डुप्लिकेट तालिका में एक पहचान कॉलम जोड़ें जो एक पंक्ति अद्वितीय पहचानकर्ता (ऑटो वृद्धिशील आरोही क्रम) के रूप में कार्य करता है:

 alter table tbl add sno int identity(1,1)

तालिका

यह क्वेरी न्यूनतम (दिनांक) के साथ केवल गैर डुप्लिकेट पंक्तियों का चयन करती है:

(select min(date),sno From tbl group by source)

तो "स्नो" बराबर होगा "1" और "4"।

अब इस तालिका के साथ जुड़ें, और डुप्लीकेट किए गए जोड़ों के रिकॉर्ड्स को हटाएं (t.sno शून्य है)

delete E from tbl E
left join
(select min(date),sno From tbl group by source) T on E.sno=T.sno
where T.sno is null

टेबल तीन

इस लिंक के विधि 3 से अनुकूलित समाधान: संपर्क