2013-06-20 4 views
6

मैं कई रिकॉर्ड (बिल) कि मूल रूप से एक-दूसरे के डुप्लिकेट, एक क्षेत्र है, जो भाषा है कि बिल में है का प्रतिनिधित्व करता है के लिए छोड़करफ़िल्टर डुप्लिकेट एक क्षेत्र के आधार पर पंक्तियों

उदाहरण के लिए है:।

ID,BillID,Account,Name,Amount,Lang 
1,0001,abcd,John Smith,10.99,ENG 
2,0002,qwer,Jane Doe,9.99,ENG 
3,0001,abcd,John Smith,10.99,SPA 
4,0003,abcd,John Smith,4.99,CHI 

सभी फ़ील्ड स्ट्रिंग हैं, आईडी को छोड़कर, जो एक ऑटोऑनंबर है।

मेरी एसक्यूएल चयन में, मैं

SELECT * 
FROM Bills 
WHERE Account='abcd' 

है और यह कुल में 3 पंक्तियों, लेकिन एक ही बिल के लिए 2 पंक्तियाँ देता है। मुझे एक विशिष्ट खाते के लिए अद्वितीय बिल वापस करने की जरूरत है। तो उपरोक्त परिदृश्य में, मैं बिलिड 0003 के साथ 2 बिल और 0001 के एसपीए या ईएनजी संस्करण को पुनः प्राप्त करना चाहता हूं, लेकिन दोनों नहीं।

क्वेरी द्वारा क्या होगा?

धन्यवाद

संपादित करें: मैं एक विशिष्ट भाषा हमेशा वहाँ जा रहा है पर भरोसा नहीं कर सकते हैं। उदाहरण के लिए, मैं SELECT * FROM Bills WHERE Account='abcd' AND Lang='ENG' नहीं कह सकता क्योंकि कभी-कभी बिल केवल एक भाषा में हो सकता है, जो ENG नहीं है, और कभी-कभी किसी भी संयोजन में कई भाषाओं में हो सकता है।

+0

किस आधार पर आप चुनना चाहते हैं कि कौन सी भाषा का उपयोग करना है? वर्णमाला क्रम? बिल आईडी - सबसे कम या उच्चतम? खाता भाषा? कुछ और? –

+0

कोई विशेष वरीयता नहीं। मुझे प्रसंस्करण के लिए एक बिल प्राप्त करने की जरूरत है, न देख रहे हैं। भाषा केवल तभी होती है जब हम पीडीएफ में बिल प्रस्तुत करते हैं, लेकिन बिलों को संसाधित करने के लिए, भाषा अप्रासंगिक है। – George

उत्तर

9

शायद सबसे आसान तरीका है, का उपयोग करने के ROW_NUMBER और PARTITION BY

SELECT * FROM (
    SELECT b.*, 
    ROW_NUMBER() OVER (PARTITION BY BillID ORDER BY Lang) as num 
    FROM Bills b 
    WHERE Account = 'abcd' 
) tbl 
WHERE num = 1 
+0

मुझे यह जवाब सबसे ज्यादा पसंद है। मैंने पहले कभी इस दृष्टिकोण को नहीं देखा है। निष्पादन योजना एरिक से क्वेरी इंगित करती है और उपयोगकर्ता 2407394 क्वेरी लागत में बराबर होती है। – George

7
select 
ID,BillID,Account,Name,Amount,max(Lang) 
FROM Bills 
WHERE Account='abcd' 
group by BillID,Account,Name,Amount; 

यह देखते हुए कि यदि आप कई भाषाओं में समान बिल हैं तो आप किसी विशिष्ट भाषा को प्राथमिकता नहीं दे रहे हैं। उपर्युक्त क्वेरी सही काम करेगी।

संपादित करें: समूह से "आईडी" हटा दिया गया। @ फिल आप सही हैं !! !!

3
select 
BillID,Account,Name,Amount,max(Lang) 
FROM Bills 
WHERE Account='abcd' 
group by BillID,Account,Name,Amount; 

GroupBy में आईडी के बिना छोड़कर user2407394 रूप में ही हो के बाद से है कि 3 भी लौट जाएगा।

+0

मुझे लगता है कि यह (और @ user2407394 का उत्तर) त्रुटियों को देगा क्योंकि आप 'आईडी' में शामिल किए बिना 'आईडी' का चयन नहीं कर सकते हैं। –

+0

@Eric आप सही हैं। मैंने मैक्स (आईडी) का उपयोग करने के लिए क्वेरी को संशोधित किया, जो काम करता था, लेकिन यह थोड़ी विसंगति के साथ प्रस्तुत किया गया क्योंकि MAX (आईडी) हमेशा MAX (लैंग) से मेल नहीं खाता है। मेरी पोस्ट में, परिणाम '3,0001, एबीसीडी, जॉन स्मिथ, 10.99, ईएनजी 'हो सकता है क्योंकि 3> 1 और ईएनजी> एसपीए (मुझे पता नहीं है, लेकिन आप मेरा मुद्दा प्राप्त करते हैं)। – George

+0

क्षमा करें, मेरा मतलब है कि वह आईडी भी लेना है। – Phil

संबंधित मुद्दे