दिलचस्प पोस्ट
जावास्क्रिप्ट में स्थानीय फ़ाइल सिस्टम में एक फाइल खोलना एक जावास्क्रिप्ट फ़ंक्शन को कॉल करने के लिए एक HTML बटन का उपयोग करना event.wheelDelta रिटर्न अनिर्धारित आप प्रोग्राम को एक HTML SELECT को ड्रॉप डाउन कैसे बता सकते हैं (उदाहरण के लिए, माउसओवर के कारण)? मैं डेटाटाइम पायथन मॉड्यूल का उपयोग करते हुए वर्तमान दिनांक से छह महीने की तारीख कैसे गणना करूं? Xcode – चेतावनी: C99 में फ़ंक्शन की पूर्ण घोषणा अमान्य है ओपनजीएल – सूचकांक बफ़र्स कठिनाइयों बंदरगाह मानचित्रण के बिना डॉकर कंटेनर की आईपी और पोर्ट को बाहरी डॉकर्स होस्ट को कैसे उजागर करें? मैं DataGridView के स्वचालित सॉर्टिंग को कैसे लागू करूं? क्रिया बार में ओवरफ़्लो आइकन बदलना Symfony2 और सिद्धांत का उपयोग कर मौजूदा डेटाबेस से एक एकल इकाई उत्पन्न करना 'Jdbc: mysql: // localhost: 3306 / mysql के लिए कोई उपयुक्त ड्राइवर नहीं मिला Lxml xpath में नियमित अभिव्यक्ति का उपयोग कैसे करें? 1 9 70 से पहले तारीखों के लिए स्ट्रॉटोम का उपयोग करना आईपैड एसडीके में मैपकिट में एक मार्ग को आकर्षित करना

मैं अधिकतम (कॉलम मान) के साथ पंक्तियों का चयन कैसे कर सकता हूं, SQL में दूसरे कॉलम से अलग?

मेरी टेबल है:

id home datetime player resource ---|-----|------------|--------|--------- 1 | 10 | 04/03/2009 | john | 399 2 | 11 | 04/03/2009 | juliet | 244 5 | 12 | 04/03/2009 | borat | 555 3 | 10 | 03/03/2009 | john | 300 4 | 11 | 03/03/2009 | juliet | 200 6 | 12 | 03/03/2009 | borat | 500 7 | 13 | 24/12/2008 | borat | 600 8 | 13 | 01/01/2009 | borat | 700 

मुझे प्रत्येक अलग home का चयन करने की जरूरत है जो कि अधिकतम datetime के लिए datetime

परिणाम होगा:

 id home datetime player resource ---|-----|------------|--------|--------- 1 | 10 | 04/03/2009 | john | 399 2 | 11 | 04/03/2009 | juliet | 244 5 | 12 | 04/03/2009 | borat | 555 8 | 13 | 01/01/2009 | borat | 700 

मैं प्रयास कर चुका हूं:

 -- 1 ..by the MySQL manual: SELECT DISTINCT home, id, datetime as dt, player, resource FROM topten t1 WHERE datetime = (SELECT MAX(t2.datetime) FROM topten t2 GROUP BY home ) GROUP BY datetime ORDER BY datetime DESC 

काम नहीं करता परिणाम-सेट में 130 पंक्तियाँ हैं, हालांकि डेटाबेस में 187 हैं। परिणाम में home कुछ डुप्लिकेट शामिल home

 -- 2 ..join SELECT s1.id, s1.home, s1.datetime, s1.player, s1.resource FROM topten s1 JOIN (SELECT id, MAX(datetime) AS dt FROM topten GROUP BY id) AS s2 ON s1.id = s2.id ORDER BY datetime 

नहीं। सभी रिकॉर्ड देता है

 -- 3 ..something exotic: 

विभिन्न परिणामों के साथ

वेब के समाधान से एकत्रित समाधान "मैं अधिकतम (कॉलम मान) के साथ पंक्तियों का चयन कैसे कर सकता हूं, SQL में दूसरे कॉलम से अलग?"

तुम बहुत करीब हो! आपको बस इतना करने की ज़रूरत है दोनों घर का चयन करें और यह अधिकतम तिथि समय है, फिर दो फ़ील्ड पर टूप्टेंन टेबल पर वापस जुड़ें:

 SELECT tt.* FROM topten tt INNER JOIN (SELECT home, MAX(datetime) AS MaxDateTime FROM topten GROUP BY home) groupedtt ON tt.home = groupedtt.home AND tt.datetime = groupedtt.MaxDateTime 

यहां T-SQL संस्करण जाता है:

 -- Test data DECLARE @TestTable TABLE (id INT, home INT, date DATETIME, player VARCHAR(20), resource INT) INSERT INTO @TestTable SELECT 1, 10, '2009-03-04', 'john', 399 UNION SELECT 2, 11, '2009-03-04', 'juliet', 244 UNION SELECT 5, 12, '2009-03-04', 'borat', 555 UNION SELECT 3, 10, '2009-03-03', 'john', 300 UNION SELECT 4, 11, '2009-03-03', 'juliet', 200 UNION SELECT 6, 12, '2009-03-03', 'borat', 500 UNION SELECT 7, 13, '2008-12-24', 'borat', 600 UNION SELECT 8, 13, '2009-01-01', 'borat', 700 -- Answer SELECT id, home, date, player, resource FROM (SELECT id, home, date, player, resource, RANK() OVER (PARTITION BY home ORDER BY date DESC) N FROM @TestTable )M WHERE N = 1 -- and if you really want only home with max date SELECT T.id, T.home, T.date, T.player, T.resource FROM @TestTable T INNER JOIN ( SELECT TI.id, TI.home, TI.date, RANK() OVER (PARTITION BY TI.home ORDER BY TI.date) N FROM @TestTable TI WHERE TI.date IN (SELECT MAX(TM.date) FROM @TestTable TM) )TJ ON TJ.N = 1 AND T.id = TJ.id 

संपादित करें
दुर्भाग्य से, MySQL में कोई रैंक () फ़ंक्शन नहीं है
लेकिन इसका अनुकरण किया जा सकता है, MySQL के साथ एनालिटिक एनालिटिक (उर्फ रैंकिंग) फ़ंक्शन देखें
तो यह MySQL संस्करण है:

 SELECT id, home, date, player, resource FROM TestTable AS t1 WHERE (SELECT COUNT(*) FROM TestTable AS t2 WHERE t2.home = t1.home AND t2.date > t1.date ) = 0 

सबसे तेज MySQL समाधान, आंतरिक प्रश्नों के बिना और GROUP BY बिना:

 SELECT m.* # get the row that contains the max value FROM topten m # "m" from "max" LEFT JOIN topten b # "b" from "bigger" ON m.home = b.home # match "max" row with "bigger" row by `home` AND m.datetime < b.datetime # want "bigger" than "max" WHERE b.datetime IS NULL # keep only if there is no bigger than max 

स्पष्टीकरण :

home कॉलम का उपयोग करते हुए स्वयं के साथ तालिका में शामिल हों LEFT JOIN का उपयोग परिणाम m में तालिका m से सभी पंक्तियां सुनिश्चित करता है। जिनके पास तालिका में एक मैच नहीं है, उन्हें NULL के कॉलम के लिए NULL होगा।

JOIN पर दूसरी शर्त केवल उन पंक्तियों से मिलान करने के लिए कहती है जो कि m से पंक्ति की तुलना में datetime कॉलम पर बड़ा मूल्य होती है।

प्रश्न में पोस्ट किए गए डेटा का उपयोग करते हुए, LEFT JOIN इस जोड़े को उत्पन्न करेगा:

 +------------------------------------------+--------------------------------+ | the row from `m` | the matching row from `b` | |------------------------------------------|--------------------------------| | id home datetime player resource | id home datetime ... | |----|-----|------------|--------|---------|------|------|------------|-----| | 1 | 10 | 04/03/2009 | john | 399 | NULL | NULL | NULL | ... | * | 2 | 11 | 04/03/2009 | juliet | 244 | NULL | NULL | NULL | ... | * | 5 | 12 | 04/03/2009 | borat | 555 | NULL | NULL | NULL | ... | * | 3 | 10 | 03/03/2009 | john | 300 | 1 | 10 | 04/03/2009 | ... | | 4 | 11 | 03/03/2009 | juliet | 200 | 2 | 11 | 04/03/2009 | ... | | 6 | 12 | 03/03/2009 | borat | 500 | 5 | 12 | 04/03/2009 | ... | | 7 | 13 | 24/12/2008 | borat | 600 | 8 | 13 | 01/01/2009 | ... | | 8 | 13 | 01/01/2009 | borat | 700 | NULL | NULL | NULL | ... | * +------------------------------------------+--------------------------------+ 

अंत में, WHERE क्लॉज केवल उन युग्मों को रखता है जो NULL के कॉलम में हैं (वे ऊपर तालिका में * के साथ चिह्नित हैं); इसका अर्थ है, JOIN क्लॉज से दूसरी शर्त के कारण, m से चुनी गई पंक्ति को कॉलम में datetime का सबसे बड़ा मूल्य दिया गया है।

एसक्यूएल एंटीपार्टर्न पढ़ें : अन्य एसक्यूएल युक्तियों के लिए डेटाबेस प्रोग्रामिंग पुस्तक के नुकसान से बचना

यह काम करेगा, भले ही आपके पास प्रत्येक home लिए दो या दो से अधिक पंक्तियां समान DATETIME साथ हों:

 SELECT id, home, datetime, player, resource FROM ( SELECT ( SELECT id FROM topten ti WHERE ti.home = t1.home ORDER BY ti.datetime DESC LIMIT 1 ) lid FROM ( SELECT DISTINCT home FROM topten ) t1 ) ro, topten t2 WHERE t2.id = ro.lid 

मुझे लगता है कि यह आपको इच्छित परिणाम देगा:

 SELECT home, MAX(datetime) FROM my_table GROUP BY home 

लेकिन अगर आपको अन्य कॉलमों की भी ज़रूरत है, तो बस मूल तालिका में शामिल हों ( Michael La Voie उत्तर दें)

सादर।

चूंकि लोगों को इस धागे में चलते रहना लगता है (1.5 वर्ष की टिप्पणी की अवधि) यह बहुत आसान नहीं है:

SELECT * FROM (SELECT * FROM topten ORDER BY datetime DESC) tmp GROUP BY home

कोई एकत्रीकरण कार्य आवश्यक नहीं है …

चीयर्स।

आप यह भी कोशिश कर सकते हैं और बड़े टेबल क्वेरी के लिए प्रदर्शन बेहतर होगा। यह काम करता है जब प्रत्येक घर के लिए दो से अधिक रिकॉर्ड नहीं होते हैं और उनकी तिथियां अलग-अलग होती हैं। बेहतर सामान्य माईएसक्यूएल क्वेरी माइकल ला वोई में से एक है।

 SELECT t1.id, t1.home, t1.date, t1.player, t1.resource FROM t_scores_1 t1 INNER JOIN t_scores_1 t2 ON t1.home = t2.home WHERE t1.date > t2.date 

या पोस्टग्रेज़ या उन डीबीएस के मामले में जो विश्लेषणात्मक कार्यों को प्रदान करते हैं

 SELECT t.* FROM (SELECT t1.id, t1.home, t1.date, t1.player, t1.resource , row_number() over (partition by t1.home order by t1.date desc) rw FROM topten t1 INNER JOIN topten t2 ON t1.home = t2.home WHERE t1.date > t2.date ) t WHERE t.rw = 1 

यह ओरेकल पर काम करता है:

 with table_max as( select id , home , datetime , player , resource , max(home) over (partition by home) maxhome from table ) select id , home , datetime , player , resource from table_max where home = maxhome 
 SELECT tt.* FROM TestTable tt INNER JOIN ( SELECT coord, MAX(datetime) AS MaxDateTime FROM rapsa GROUP BY krd ) groupedtt ON tt.coord = groupedtt.coord AND tt.datetime = groupedtt.MaxDateTime 

SQL सर्वर के लिए इसे आज़माएं:

 WITH cte AS ( SELECT home, MAX(year) AS year FROM Table1 GROUP BY home ) SELECT * FROM Table1 a INNER JOIN cte ON a.home = cte.home AND a.year = cte.year 
 SELECT c1, c2, c3, c4, c5 FROM table1 WHERE c3 = (select max(c3) from table) SELECT * FROM table1 WHERE c3 = (select max(c3) from table1) 

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

 select * from mytable a join (select home, max(datetime) datetime from mytable group by home) b on a.home = b.home and a.datetime = b.datetime 

सादर कश्मीर

यहां MySQL संस्करण है जो केवल एक प्रविष्टि को प्रिंट करता है जहां समूह में अधिकतम डुप्लिकेट MAX (datetime) होते हैं।

आप यहां जांच सकते हैं http://www.sqlfiddle.com/#!2/0a4ae/1

नमूना डेटा

 mysql> SELECT * from topten; +------+------+---------------------+--------+----------+ | id | home | datetime | player | resource | +------+------+---------------------+--------+----------+ | 1 | 10 | 2009-04-03 00:00:00 | john | 399 | | 2 | 11 | 2009-04-03 00:00:00 | juliet | 244 | | 3 | 10 | 2009-03-03 00:00:00 | john | 300 | | 4 | 11 | 2009-03-03 00:00:00 | juliet | 200 | | 5 | 12 | 2009-04-03 00:00:00 | borat | 555 | | 6 | 12 | 2009-03-03 00:00:00 | borat | 500 | | 7 | 13 | 2008-12-24 00:00:00 | borat | 600 | | 8 | 13 | 2009-01-01 00:00:00 | borat | 700 | | 9 | 10 | 2009-04-03 00:00:00 | borat | 700 | | 10 | 11 | 2009-04-03 00:00:00 | borat | 700 | | 12 | 12 | 2009-04-03 00:00:00 | borat | 700 | +------+------+---------------------+--------+----------+ 

उपयोगकर्ता चर के साथ MySQL संस्करण

 SELECT * FROM ( SELECT ord.*, IF (@prev_home = ord.home, 0, 1) AS is_first_appear, @prev_home := ord.home FROM ( SELECT t1.id, t1.home, t1.player, t1.resource FROM topten t1 INNER JOIN ( SELECT home, MAX(datetime) AS mx_dt FROM topten GROUP BY home ) x ON t1.home = x.home AND t1.datetime = x.mx_dt ORDER BY home ) ord, (SELECT @prev_home := 0, @seq := 0) init ) y WHERE is_first_appear = 1; +------+------+--------+----------+-----------------+------------------------+ | id | home | player | resource | is_first_appear | @prev_home := ord.home | +------+------+--------+----------+-----------------+------------------------+ | 9 | 10 | borat | 700 | 1 | 10 | | 10 | 11 | borat | 700 | 1 | 11 | | 12 | 12 | borat | 700 | 1 | 12 | | 8 | 13 | borat | 700 | 1 | 13 | +------+------+--------+----------+-----------------+------------------------+ 4 rows in set (0.00 sec) 

स्वीकृत जवाब 'आउटआउट

 SELECT tt.* FROM topten tt INNER JOIN ( SELECT home, MAX(datetime) AS MaxDateTime FROM topten GROUP BY home ) groupedtt ON tt.home = groupedtt.home AND tt.datetime = groupedtt.MaxDateTime +------+------+---------------------+--------+----------+ | id | home | datetime | player | resource | +------+------+---------------------+--------+----------+ | 1 | 10 | 2009-04-03 00:00:00 | john | 399 | | 2 | 11 | 2009-04-03 00:00:00 | juliet | 244 | | 5 | 12 | 2009-04-03 00:00:00 | borat | 555 | | 8 | 13 | 2009-01-01 00:00:00 | borat | 700 | | 9 | 10 | 2009-04-03 00:00:00 | borat | 700 | | 10 | 11 | 2009-04-03 00:00:00 | borat | 700 | | 12 | 12 | 2009-04-03 00:00:00 | borat | 700 | +------+------+---------------------+--------+----------+ 7 rows in set (0.00 sec) 

क्यों नहीं का उपयोग करें: घर का चयन करें, मैक्स (अधिकतम समय) MAXDateTime के रूप में, खिलाड़ी, घर से संसाधन से ग्रुप ग्रुप मैंने कुछ याद किया?

यह आपको आवश्यक क्वेरी है:

  SELECT b.id, a.home,b.[datetime],b.player,a.resource FROM (SELECT home,MAX(resource) AS resource FROM tbl_1 GROUP BY home) AS a LEFT JOIN (SELECT id,home,[datetime],player,resource FROM tbl_1) AS b ON a.resource = b.resource WHERE a.home =b.home; 

@ मिचिया स्वीकार किए जाते हैं उत्तर अधिकांश मामलों में ठीक काम करेगा लेकिन यह नीचे के लिए एक के लिए विफल हो सकता है

अगर होमआईड वाले दो पंक्तियां होती हैं और समयरेखा ही होती है तो क्वेरी दोनों पंक्तियों को लौटाएगी, न कि अलग-अलग होमआईड की आवश्यकता के लिए, इसके लिए क्वेरी में अलग-अलग जोड़ने के लिए नीचे दिए गए हैं।

 SELECT DISTINCT tt.home , tt.MaxDateTime FROM topten tt INNER JOIN (SELECT home, MAX(datetime) AS MaxDateTime FROM topten GROUP BY home) groupedtt ON tt.home = groupedtt.home AND tt.datetime = groupedtt.MaxDateTime 

जीपी का एक अन्य तरीका एक उप क्वेरी का उपयोग कर प्रति समूह की हाल ही की पंक्ति है जो मूल रूप से प्रति समूह प्रत्येक पंक्ति के लिए एक रैंक की गणना करता है और फिर रैंक = 1 के साथ अपनी सबसे हाल की पंक्तियों को फ़िल्टर करता है

 select a.* from topten a where ( select count(*) from topten b where a.home = b.home and a.`datetime` < b.`datetime` ) +1 = 1 

डेमो

बेहतर समझने के लिए प्रत्येक पंक्ति के लिए रैंक नंबर के लिए दृश्य डेमो है

कुछ टिप्पणियों को पढ़कर, क्या दो पंक्तियां हैं जिनके पास 'होम' और 'डेट टाइम' फ़ील्ड मान हैं?

ऊपर की क्वेरी असफल हो जाएगी और ऊपर की स्थिति के लिए 1 से अधिक पंक्तियां लौटाएगी। इस स्थिति को कवर करने के लिए एक और मानदंड / पैरामीटर / कॉलम की आवश्यकता होगी ताकि यह निर्णय लिया जा सके कि कौन सी पंक्ति ली जानी चाहिए जो ऊपर की स्थिति में आती है। नमूना डेटा सेट देखने से मुझे लगता है कि एक प्राथमिक कुंजी कॉलम id जो ऑटो वृद्धि पर सेट होना चाहिए। तो हम इस कॉलम का इस्तेमाल करके सीएसएस स्टेटमेंट की मदद से उसी क्वेरी को tweaking द्वारा सबसे हाल की पंक्ति चुन सकते हैं

 select a.* from topten a where ( select count(*) from topten b where a.home = b.home and case when a.`datetime` = b.`datetime` then a.id < b.id else a.`datetime` < b.`datetime` end ) + 1 = 1 

डेमो

क्वेरी के ऊपर एक ही datetime मानों के बीच सर्वोच्च आईडी के साथ पंक्ति को चुनना होगा

प्रत्येक पंक्ति के लिए रैंक नंबर के लिए दृश्य डेमो