दिलचस्प पोस्ट
.NET के HttpWebRequest / Response के साथ एक स्व-हस्ताक्षरित प्रमाणपत्र का उपयोग करना मैं एक बार प्रति आवेदन शुरू करने के लिए कुछ एक बार कैसे निष्पादित कर सकता हूं? जावा स्ट्रिंग चर का उपयोग .next () या .nextLine () Jquery का उपयोग करके मेरे ब्राउज़र में फ़ुलस्क्रीन मोड प्राप्त करना सीएसएस पृष्ठभूमि-आकार: कवर + पृष्ठभूमि-अटैचमेंट: फिक्स्ड कतरन पृष्ठभूमि चित्र क्या अजगर जावा क्लास के लिए बराबर है। ForName ()? Android INJECT_EVENTS अनुमति Asp.net MVC मॉडलस्टेट। क्लीअर ओपनसीवी में बीफ़डेड इमेज को बदलना स्विफ्ट में एक अलग व्यू नियंत्रक से एक TableView में डेटा को पुनः लोड कैसे करें एंड्रॉइड में जीएसओएन या किसी अन्य लाइब्रेरी का उपयोग किए बिना स्ट्रोरिंग के रूप में प्रतिक्रिया कैसे प्राप्त करें क्या जावा में एन-लेवल नेस्टेड लूप करने का कोई तरीका है? मोंगोडीबी के साथ एक "पसंद" मतदान प्रणाली को कैसे तैयार किया जाए सी # का उपयोग करते हुए मैं .NET में मौजूदा उपयोगकर्ता नाम कैसे प्राप्त करूं? क्यों awk सरणी randomize लगता है?

कई कॉलम से न्यूनतम मूल्य चुनने का सबसे अच्छा तरीका क्या है?

SQL Server 2005 में निम्न तालिका को देखते हुए:

ID Col1 Col2 Col3 -- ---- ---- ---- 1 3 34 76 2 32 976 24 3 7 235 3 4 245 1 792 

निम्नलिखित परिणाम प्राप्त करने वाली क्वेरी को लिखने का सबसे अच्छा तरीका क्या है (यानी एक जो कि अंतिम कॉलम की पैदावार करता है – एक कॉलम जिसमें कॉल 1, कॉल 2, और प्रत्येक पंक्ति के लिए कर्नेल 2 के न्यूनतम मूल्य शामिल हैं )?

 ID Col1 Col2 Col3 TheMin -- ---- ---- ---- ------ 1 3 34 76 3 2 32 976 24 24 3 7 235 3 3 4 245 1 792 1 

अद्यतन करें:

स्पष्टीकरण के लिए (जैसा कि मैंने coments में कहा है) असली परिदृश्य में डेटाबेस ठीक से सामान्यीकृत है ये "सरणी" स्तंभ किसी वास्तविक तालिका में नहीं हैं, लेकिन परिणामस्वरूप एक रिपोर्ट में आवश्यक है। और नई आवश्यकता यह है कि रिपोर्ट को भी इस MinValue कॉलम की आवश्यकता है। मैं अंतर्निहित परिणाम सेट को नहीं बदल सकता और इसलिए मैं "जेल कार्ड से बाहर निकलने" के लिए एक टी-एसक्यूएल को देख रहा था।

मैंने नीचे दिए गए मामला दृष्टिकोण की कोशिश की और यह काम करता है, हालांकि यह थोड़ी जटिल है यह उत्तर में उल्लेखित की तुलना में भी अधिक जटिल है क्योंकि आपको इस तथ्य को पूरा करने की आवश्यकता है कि समान पंक्ति में दो न्यूनतम मूल्य हैं

वैसे भी, मैंने सोचा कि मैं अपने मौजूदा समाधान को पोस्ट करूंगा, जो मेरी बाधाओं को देखते हुए, बहुत अच्छी तरह से काम करता है यह UNPIVOT ऑपरेटर का उपयोग करता है:

 with cte (ID, Col1, Col2, Col3) as ( select ID, Col1, Col2, Col3 from TestTable ) select cte.ID, Col1, Col2, Col3, TheMin from cte join ( select ID, min(Amount) as TheMin from cte UNPIVOT (Amount for AmountCol in (Col1, Col2, Col3)) as unpvt group by ID ) as minValues on cte.ID = minValues.ID 

मैं अग्रिम कहूँगा कि मुझे उम्मीद है कि यह सबसे अच्छा प्रदर्शन करने की पेशकश करे, लेकिन परिस्थितियों को देखते हुए (मैं सिर्फ नए मिन वेल्यू कॉलम की ज़रूरत के लिए सभी प्रश्नों को फिर से डिज़ाइन नहीं कर सकता), यह एक सुंदर सुरुचिपूर्ण है "जेल से बाहर निकलना कार्ड "।

वेब के समाधान से एकत्रित समाधान "कई कॉलम से न्यूनतम मूल्य चुनने का सबसे अच्छा तरीका क्या है?"

यह पूरा करने के कई तरीके होने की संभावना है मेरा सुझाव केस / जब यह करने के लिए उपयोग करना है। 3 कॉलम के साथ, यह बहुत बुरा नहीं है।

 Select Id, Case When Col1 < Col2 And Col1 < Col3 Then Col1 When Col2 < Col1 And Col2 < Col3 Then Col2 Else Col3 End As TheMin From YourTableNameHere 

CROSS APPLY का उपयोग करना:

 SELECT ID, Col1, Col2, Col3, MinValue FROM YourTable CROSS APPLY (SELECT MIN(d) MinValue FROM (VALUES (Col1), (Col2), (Col3)) AS a(d)) A 

एसक्यूएल फ्यूल्ड

सबसे अच्छा तरीका वास्तव में ऐसा नहीं करना है – यह अजीब बात है कि लोग अपने डेटा को ऐसे तरीके से संग्रहीत करने पर जोर देते हैं जिससे एसक्यूएल "जिमनास्टिक" को सार्थक जानकारी प्राप्त करने की ज़रूरत होती है, जब वांछित परिणाम प्राप्त करने के लिए बहुत आसान तरीके होते हैं, अगर आप सही ढंग से अपना स्कीमा सामान्य बनाते हैं ।

ऐसा करने का सही तरीका, मेरी राय में, निम्नलिखित तालिका होना है:

 ID Col Val -- --- --- 1 1 3 1 2 34 1 3 76 2 1 32 2 2 976 2 3 24 3 1 7 3 2 235 3 3 3 4 1 245 4 2 1 4 3 792 

ID/Col साथ प्राथमिक कुंजी के रूप में और संभावित Col रूप में आपकी आवश्यकताओं के आधार पर तब आपकी क्वेरी एक साधारण हो जाती है

 select min(val) from tbl 

और आप अब भी अलग-अलग 'पुराने कॉलम' का उपयोग अलग-अलग करके कर सकते हैं

 where col = 2 

आपके अन्य प्रश्नों में यह भी आसान विस्तार के लिए अनुमति देता है 'पुराने कॉलम' की संख्या बढ़ने चाहिए

यह आपके प्रश्नों को इतना आसान बनाता है सामान्य दिशानिर्देश मैं उपयोग करने के लिए होता है, यदि आपके पास कभी ऐसा कुछ होता है जो किसी डेटाबेस पंक्ति में एक सरणी की तरह दिखता है, तो आप संभवतः कुछ गलत कर रहे हैं और डेटा के पुनर्गठन के बारे में सोचना चाहिए।


हालांकि, यदि किसी कारण के लिए आप उन कॉलम को नहीं बदल सकते हैं, तो मुझे डालने और अपडेट ट्रिगर का उपयोग करने का सुझाव दिया गया था और एक और कॉलम जोड़ दिया गया था जो ये कॉलम Col1/2/3 पर कम से कम सेट हो गए हैं। यह ऑपरेशन की 'लागत' को चुनने से दूर / अपडेट करने के लिए उस स्थान पर स्थानांतरित करेगा जहां यह संबंधित है – मेरे अनुभव में अधिकांश डेटाबेस तालिकाओं को लिखित रूप से ज्यादा बार पढ़ा जाता है ताकि लिखे जाने पर खर्च को अधिक कुशल बना दिया जाए।

दूसरे शब्दों में, एक पंक्ति के लिए न्यूनतम परिवर्तन तब होता है जब दूसरे कॉलम में से एक बदल जाता है, इसलिए जब आप इसे गणना करते हैं, हर बार जब आप चयन नहीं करते (जो डेटा खराब नहीं होता है तो बर्बाद होता है)। तब आप की तरह एक तालिका के साथ समाप्त होगा:

 ID Col1 Col2 Col3 MinVal -- ---- ---- ---- ------ 1 3 34 76 3 2 32 976 24 24 3 7 235 3 3 4 245 1 792 1 

किसी भी अन्य विकल्प का select समय पर निर्णय करना होता है आम तौर पर एक बुरा विचार प्रदर्शन-वार होता है, क्योंकि डेटा केवल डालने / अपडेट पर बदलता है – एक अन्य कॉलम के अलावा डीबी में अधिक जगह लेता है और आवेषण के लिए थोड़ा धीमा हो जाता है और अपडेट, लेकिन चुनने के लिए बहुत तेज़ हो सकता है – पसंदीदा दृष्टिकोण आपकी प्राथमिकताओं पर निर्भर होना चाहिए, लेकिन जैसा कि कहा गया है, अधिकांश तालिकाओं को लिखे गए शब्दों की तुलना में अधिक बार पढ़ा जाता है।

यदि स्तंभ आपके उदाहरण के रूप में पूर्णांक थे I एक फ़ंक्शन बनाते हैं:

 create function f_min_int(@a as int, @b as int) returns int as begin return case when @a < @b then @a else coalesce(@b,@a) end end 

तो जब मुझे इसका उपयोग करना है तो मैं करता हूं:

 select col1, col2, col3, dbo.f_min_int(dbo.f_min_int(col1,col2),col3) 

यदि आपके पास 5 colums हैं तो ऊपर हो जाता है

 select col1, col2, col3, col4, col5, dbo.f_min_int(dbo.f_min_int(dbo.f_min_int(dbo.f_min_int(col1,col2),col3),col4),col5) 

आप मोड़ के साथ "जानवर बल" दृष्टिकोण का उपयोग कर सकते हैं:

 SELECT CASE WHEN Col1 <= Col2 AND Col1 <= Col3 THEN Col1 WHEN Col2 <= Col3 THEN Col2 ELSE Col3 END AS [Min Value] FROM [Your Table] 

जब पहली बार हालत विफल हो जाती है तो यह गारंटी देता है कि Col1 सबसे छोटा मूल्य नहीं है इसलिए आप इसे बाकी की स्थिति से समाप्त कर सकते हैं। इसी तरह की स्थिति के लिए पांच कॉलम के लिए आपकी क्वेरी बनती है:

 SELECT CASE WHEN Col1 <= Col2 AND Col1 <= Col3 AND Col1 <= Col4 AND Col1 <= Col5 THEN Col1 WHEN Col2 <= Col3 AND Col2 <= Col4 AND Col2 <= Col5 THEN Col2 WHEN Col3 <= Col4 AND Col3 <= Col5 THEN Col3 WHEN Col4 <= Col5 THEN Col4 ELSE Col5 END AS [Min Value] FROM [Your Table] 

ध्यान दें कि अगर दो या दो से अधिक स्तंभों के बीच एक टाई है तो <= यह सुनिश्चित करता है कि हम यथाशीघ्र CASE कथन से बाहर निकलते हैं।

आप यह एक यूनियन क्वेरी से भी कर सकते हैं। कॉलम में वृद्धि की संख्या के रूप में, आपको क्वेरी को संशोधित करने की आवश्यकता होगी, लेकिन कम से कम यह सीधे आगे संशोधन होगा।

 Select T.Id, T.Col1, T.Col2, T.Col3, A.TheMin From YourTable T Inner Join ( Select A.Id, Min(A.Col1) As TheMin From ( Select Id, Col1 From YourTable Union All Select Id, Col2 From YourTable Union All Select Id, Col3 From YourTable ) As A Group By A.Id ) As A On T.Id = A.Id 
 SELECT ID, Col1, Col2, Col3, (SELECT MIN(Col) FROM (VALUES (Col1), (Col2), (Col3)) AS X(Col)) AS TheMin FROM Table 

यह जानवर बल है लेकिन काम करता है

  select case when col1 <= col2 and col1 <= col3 then col1 case when col2 <= col1 and col2 <= col3 then col2 case when col3 <= col1 and col3 <= col2 then col3 as 'TheMin' end from Table T 

… क्योंकि न्यूनतम () केवल एक कॉलम पर काम करता है और स्तंभों में नहीं।

यह दोनों प्रश्न और इस प्रश्न का उत्तर देने की कोशिश करते हैं।

रीकैप यह है कि ओरेकल में इसके लिए एक फ़ंक्शन बनाया गया है, एसक्यूएल सर्वर के साथ आप या तो उपयोगकर्ता परिभाषित-फंक्शन परिभाषित कर रहे हैं या केस स्टेटमेंट का इस्तेमाल कर रहे हैं।

यदि आप एक संग्रहीत कार्यविधि बनाने में सक्षम हैं, तो यह मूल्यों की एक सरणी ले सकता है, और आप इसे केवल कॉल कर सकते हैं

 select *, case when column1 < columnl2 And column1 < column3 then column1 when columnl2 < column1 And columnl2 < column3 then columnl2 else column3 end As minValue from tbl_example 

संघ प्रश्न पर थोड़ा मोड़:

 DECLARE @Foo TABLE (ID INT, Col1 INT, Col2 INT, Col3 INT) INSERT @Foo (ID, Col1, Col2, Col3) VALUES (1, 3, 34, 76), (2, 32, 976, 24), (3, 7, 235, 3), (4, 245, 1, 792) SELECT ID, Col1, Col2, Col3, ( SELECT MIN(T.Col) FROM ( SELECT Foo.Col1 AS Col UNION ALL SELECT Foo.Col2 AS Col UNION ALL SELECT Foo.Col3 AS Col ) AS T ) AS TheMin FROM @Foo AS Foo 

यदि आप एसक्यूएल 2005 का प्रयोग करते हैं तो आप इस तरह से कुछ साफ कर सकते हैं:

 ;WITH res AS ( SELECT t.YourID , CAST(( SELECT Col1 AS c01 , Col2 AS c02 , Col3 AS c03 , Col4 AS c04 , Col5 AS c05 FROM YourTable AS cols WHERE YourID = t.YourID FOR XML AUTO , ELEMENTS ) AS XML) AS colslist FROM YourTable AS t ) SELECT YourID , colslist.query('for $c in //cols return min(data($c/*))').value('.', 'real') AS YourMin , colslist.query('for $c in //cols return avg(data($c/*))').value('.', 'real') AS YourAvg , colslist.query('for $c in //cols return max(data($c/*))').value('.', 'real') AS YourMax FROM res 

इस तरह आप इतने सारे ऑपरेटरों में खो नहीं पाते 🙂

हालांकि, यह अन्य विकल्पों की तुलना में धीमा हो सकता है

यह तुम्हारी पसंद है…

नीचे मैं कई तिथियों को न्यूनतम करने के लिए एक अस्थायी तालिका का उपयोग करता हूं। पहली अस्थायी तालिका विभिन्न तारीखें (साथ ही क्वेरी के लिए अन्य मान) प्राप्त करने के लिए कई तालिकाओं में प्रश्न पूछती हैं, दूसरी टेम्पल तालिका तब विभिन्न कॉलमों और न्यूनतम पास की संख्या का उपयोग करके प्राप्त होती है क्योंकि तारीख कॉलम हैं।

यह अनिवार्य रूप से यूनियन क्वेरी की तरह है, वही नंबर की आवश्यकता होती है, लेकिन अधिक कुशल हो सकती है (अनुभव के आधार पर, लेकिन परीक्षण की आवश्यकता होगी)। इस मामले में दक्षता कोई समस्या नहीं थी (8,000 रिकॉर्ड)। एक सूचकांक आदि सकता है

 --==================== this gets minimums and global min if object_id('tempdb..#temp1') is not null drop table #temp1 if object_id('tempdb..#temp2') is not null drop table #temp2 select r.recordid , r.ReferenceNumber, i.InventionTitle, RecordDate, i.ReceivedDate , min(fi.uploaddate) [Min File Upload], min(fi.CorrespondenceDate) [Min File Correspondence] into #temp1 from record r join Invention i on i.inventionid = r.recordid left join LnkRecordFile lrf on lrf.recordid = r.recordid left join fileinformation fi on fi.fileid = lrf.fileid where r.recorddate > '2015-05-26' group by r.recordid, recorddate, i.ReceivedDate, r.ReferenceNumber, i.InventionTitle select recordid, recorddate [min date] into #temp2 from #temp1 update #temp2 set [min date] = ReceivedDate from #temp1 t1 join #temp2 t2 on t1.recordid = t2.recordid where t1.ReceivedDate < [min date] and t1.ReceivedDate > '2001-01-01' update #temp2 set [min date] = t1.[Min File Upload] from #temp1 t1 join #temp2 t2 on t1.recordid = t2.recordid where t1.[Min File Upload] < [min date] and t1.[Min File Upload] > '2001-01-01' update #temp2 set [min date] = t1.[Min File Correspondence] from #temp1 t1 join #temp2 t2 on t1.recordid = t2.recordid where t1.[Min File Correspondence] < [min date] and t1.[Min File Correspondence] > '2001-01-01' select t1.*, t2.[min date] [LOWEST DATE] from #temp1 t1 join #temp2 t2 on t1.recordid = t2.recordid order by t1.recordid 

यदि आप जानते हैं कि आप किस मूल्य की तलाश कर रहे हैं, आमतौर पर एक स्थिति कोड, निम्नलिखित सहायक हो सकते हैं:

 select case when 0 in (PAGE1STATUS ,PAGE2STATUS ,PAGE3STATUS, PAGE4STATUS,PAGE5STATUS ,PAGE6STATUS) then 0 else 1 end FROM CUSTOMERS_FORMS 

इसे इस्तेमाल करो:

 select least(col1, col2, col3) FROM yourtable 

कई कॉलम के लिए अपने सबसे अच्छे मामले का प्रयोग करें, हालांकि दो संख्यात्मक स्तंभों के लिए मैं और जम्मू आप साधारण गणित का उपयोग कर सकते हैं:

मिनट (आई, जे) = (i + j) / 2 – पेट (ij) / 2

यह सूत्र कई कॉलमों के न्यूनतम मूल्य प्राप्त करने के लिए इस्तेमाल किया जा सकता है, लेकिन इसकी वास्तविकता ग़लत 2, मिनट (आई, जे, कश्मीर) न्यूनतम (i, न्यूनतम (जे, कश्मीर) होगा)

 SELECT [ID], ( SELECT MIN([value].[MinValue]) FROM ( VALUES ([Col1]), ([Col1]), ([Col2]), ([Col3]) ) AS [value] ([MinValue]) ) AS [MinValue] FROM Table;