আমি কীভাবে ম্যাক্স (কলাম মান), এসকিউএল এর অন্য কলাম দ্বারা DISTINCT দিয়ে সারি নির্বাচন করতে পারি?


767

আমার টেবিলটি হ'ল:

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

ফলাফল হবে:

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 ধারণ করে Res ফলাফলটিতে কিছু সদৃশ রয়েছে 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: 

বিভিন্ন ফলাফল সহ।

উত্তর:


937

তুমি এত কাছে! আপনাকে যা করতে হবে তা হল বাড়ি এবং তার সর্বাধিক তারিখের সময় দুটি নির্বাচন করা, তারপরে দুটি toptenক্ষেত্রের টেবিলে ফিরে যোগ দিন :

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

5
স্বতন্ত্রভাবে এটি পরীক্ষা করুন, যদি দুটি ঘরে সমান সর্বোচ্চ ডেটটাইম একই বাড়িতে থাকে (বিভিন্ন খেলোয়াড়ের সাথে)
ম্যাকসেম গোঁটার

5
আমি মনে করি এটি করার সর্বোত্তম উপায়টি প্রাকৃতিক যোগদানের সাথে রয়েছে: "নির্বাচন করুন টি টি। ঠিক একই প্রশ্ন, তবে তর্কযোগ্যভাবে আরও পঠনযোগ্য
পার্কার

31
যদি দুটি সারি একই 'হোম' এবং 'ডেটটাইম' ক্ষেত্রের মান থাকে তবে কী হবে?
কামাল দুরান

3
@Young আপনার প্রশ্নের সঙ্গে সমস্যা যে এটা ফেরত দিতে পারেন id, playerএবং resourceবাড়িতে = 10 আপনি পেতে পারে একটি প্রদত্ত বাড়ি অর্থাত জন্য অ সর্বোচ্চ সারির: 3 | 10 | 04/03/2009 | john | 300 অন্য কথায় এটা গ্যারান্টী বা নিশ্চয়তা দিচ্ছে না যে, resultset একটি সারিতে সব কলাম অন্তর্গত হবে প্রদত্ত বাড়ির জন্য সর্বোচ্চ (তারিখের সময়)।
12:57 এ স্যাটিউ করুন

1
@ me1111 আপনার প্রশ্নের সাথে সমস্যাটি হ'ল এটি কোনও প্রদত্ত বাড়ির জন্য সারি সর্বাধিক (ডেটটাইম) ফিরিয়ে দিতে পারে না। গ্রুপের কারণে প্রতিটি বাড়ির জন্য যেকোনও এলোমেলো সারি আনতে হবে এবং গোষ্ঠীর দ্বারা অর্ডার কেবল গ্রুপের দ্বারা উত্পাদিত সামগ্রিক
ফলাফলগুলি সাজিয়ে রাখবে

86

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ফলাফল সেটে প্রদর্শিত হবে তা নিশ্চিত করে । ঐ যে টেবিলে একটি ম্যাচ হবে না bহবে NULLএর কলামের জন্য গুলি b

অন্যান্য শর্ত JOINশুধুমাত্র সারি থেকে মেলে জিজ্ঞেস bউপর বড় মূল্য আছে datetimeথেকে সারি চেয়ে কলাম m

প্রশ্নটিতে পোস্ট করা ডেটা ব্যবহার করে, 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যাগুলির কলামগুলিতে রয়েছে b(সেগুলি *উপরের সারণীতে চিহ্নিত রয়েছে ); এর অর্থ, JOINধারাটি থেকে দ্বিতীয় শর্তের কারণে , নির্বাচিত সারিটির mকলামে সর্বাধিক মান রয়েছে datetime

এসকিউএল অ্যান্টিপ্যাটার্নগুলি পড়ুন : অন্যান্য এসকিউএল টিপসের জন্য ডেটাবেস প্রোগ্রামিং বইয়ের ক্ষতিগুলি এড়ানো


সাথে SQLite, প্রথমটি লা ভিয়ের সংস্করণের তুলনায় অনেক ধীর গতিতে যখন ম্যাচ করা কলামে কোনও সূচক নেই (যেমন "হোম")। (24k সারিগুলির সাথে পরীক্ষিত যার ফলশ্রুতিতে 13k সারি রয়েছে)
টমাস টেম্পেলম্যান

10
এটি সর্বোত্তম উত্তর, আপনি যদি কার্য সম্পাদন পরিকল্পনাটি দেখান তবে আপনি এই প্রশ্নের সাথে আরও এক ধাপ কম দেখতে পাবেন
TlmaK0

যদি 2 সারি একই আছে কি ঘটবে homeএবং datetimeএবং datetimeসেই নির্দিষ্ট জন্য সর্বোচ্চ home?
ইসতিয়াক আহমেদ

উভয় সারি ফলাফল সেট প্রদর্শিত হবে। এই উত্তরটি ধারণার প্রমাণ। আপনার আসল কোডে সম্ভবত এই পরিস্থিতিতে তাদের মধ্যে একটিকে বেছে নেওয়ার জন্য সম্ভবত আপনার আরেকটি মানদণ্ড রয়েছে (সম্ভবত প্রথমটি বা শেষটি বা আপনি সিদ্ধান্ত নিতে অন্য কলামটি ব্যবহার করেন)। এই ONদফায় নতুন শর্ত হিসাবে এই মানদণ্ডটি যুক্ত করুন । ফে ... ON ... AND m.id < b.idসাম্প্রতিকতম এন্ট্রি (সর্বাধিক সঙ্গে এক রাখার id) দুই সারি একই মান আছে homeএবং datetimeকলাম এবং এটি সর্বাধিক হয় datetime
axiac

কোন সূচকগুলি এই জাতীয় কোনও প্রশ্নের জন্য সর্বোত্তমভাবে অনুকূল করবে?
আজাক্সলিউং

73

এখানে টি-এসকিউএল সংস্করণ রয়েছে:

-- 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

সম্পাদনা করুন
দুর্ভাগ্যক্রমে, মাইএসকিউএলে কোনও RANK () ওভার ফাংশন নেই।
তবে এটি অনুকরণ করা যেতে পারে, মাইএসকিউএল সহ এমুলেটিং অ্যানালিটিক (একা র‌্যাঙ্কিং) ফাংশনগুলি দেখুন
সুতরাং এটি মাইএসকিউএল সংস্করণ:

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

দুঃখিত, # 1064 - আপনার এসকিউএল সিনট্যাক্সে আপনার একটি ত্রুটি রয়েছে; 'মাইএসকিউএল সার্ভার সংস্করণের সাথে সামঞ্জস্যপূর্ণ ম্যানুয়ালটি যা' () ওভার (দিনের সময় ডিইএসসি দ্বারা কেআরডি অর্ডার দ্বারা পার্টিশন) এন লাইন 1
কাপ্তাহ

2
আহ, সুতরাং আপনি মাইএসকিউএল ব্যবহার করছেন। এটাই আপনার থেকে শুরু করা উচিত! আমি শীঘ্রই উত্তর আপডেট করব।
ম্যাকসেম গোঁটার

@ ম্যাক্সগোন্টার, আপনার মাইএসকিএল সমাধান শিলস, থেক্স। যদি আপনার @_Test টেবিলের মধ্যে আপনি # 1> সারিটি সরিয়ে ফেলেন: 1, 10, '2009-03-04', 'জন', 399, এটি, যদি আপনার প্রদত্ত বাড়ির মানটির জন্য একটি একক সারি থাকে? ধন্যবাদ.
egidiocs

2
বুগ: "RANK ()" কে "ROW_NUMBER ()" দিয়ে প্রতিস্থাপন করুন। আপনার যদি টাই থাকে (ডুপ্লিকেট তারিখের মানের কারণে) আপনার কাছে এন এর জন্য "1" এর সাথে দুটি রেকর্ড থাকবে
মাইকটিভি

29

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

টেবিলে
lাকনা

1
এটি পিএইচপিএমআইএডমিনে চালিত হয়নি। পৃষ্ঠা সতেজ করে তবে ফলাফল বা ত্রুটি নেই ..?
কাপ্তাহ

WHERE ti.home = t1.home- আপনি সিনট্যাক্স ব্যাখ্যা করতে পারেন?
ইসতিয়াক আহমেদ

@ ইসতিয়াক আহমেদ: ঠিক এখানে কি আপনি বুঝতে পারছেন না? এটি একটি সম্পর্কিত সম্পর্কযুক্ত ক্যোয়ারী, এবং আপনি যে অভিব্যক্তিটি উল্লেখ করেছেন সেটি হ'ল একটি সম্পর্ক সম্পর্কিত শর্ত condition
কাসনসুই

@ ক্যাসনোই, যে selectপ্রশ্নটিতে লাইনটি রয়েছে WHERE ti.home = t1.home তার FROMএমন সংজ্ঞাটির সংজ্ঞা নেই যা সংজ্ঞায়িত করে t1। তাহলে এটি কীভাবে ব্যবহৃত হয়?
ইসতিয়াক আহমেদ

26

আমি মনে করি এটি আপনাকে পছন্দসই ফলাফল দেবে:

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

কিন্তু যদি আপনি অন্য কলাম পাশাপাশি প্রয়োজন, শুধু একটি মূল সারণী (চেক দিয়ে যোগদানের করতে Michael La Voieউত্তর)

শুভেচ্ছান্তে.


8
তার অন্যান্য কলামও দরকার।
কাসনসুই

4
আইডি, হোম, ডেটটাইম, প্লেয়ার, রিসোর্স
কাসনসুই

17

যেহেতু লোকেরা এই থ্রেডে চলেছে বলে মনে হচ্ছে (মন্তব্যের তারিখের বয়স 1.5 বছর) এটি এত সহজ নয়:

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

কোন একীকরণ ফাংশন প্রয়োজন ...

চিয়ার্স।


6
এটি কাজ করে না বলে মনে হচ্ছে। ত্রুটির বার্তা: কলাম 'x' নির্বাচন তালিকাটিতে অবৈধ কারণ এটি কোনও সামগ্রিক ফাংশন বা গ্রুপ বাই দফায় নেই।
পাখি

এটি অবশ্যই এসকিউএল সার্ভার বা ওরাকলে কাজ করবে না, যদিও মনে হচ্ছে এটি মাইএসকিউএলে কাজ করে in
এরিক

এটি সত্যিই সুন্দর! কিভাবে কাজ করে? ডিইএসসি এবং ডিফল্ট গ্রুপ রিটার্ন কলাম ব্যবহার করে? সুতরাং আমি যদি এটি ডেটটাইম এএসসিতে পরিবর্তন করি তবে এটি প্রতিটি বাড়ির প্রথম সারিতে ফিরে আসবে?
ওয়েফথফিউচার

ইহা অসাধারণ!
কুকুর প্রেমিকা

আপনার অনাগ্রেগেটেড কলাম (মাইএসকিউএল) থাকলে এই সরল-আপ কাজ করে না।
ব্যবহারকারী 3562927

11

আপনি এটি ব্যবহার করে দেখতে পারেন এবং বড় টেবিলগুলির জন্য ক্যোয়ারী কর্মক্ষমতা আরও ভাল। এটি তখন কার্যকর হয় যখন প্রতিটি বাড়ির জন্য দুটিরও বেশি রেকর্ড থাকে না এবং তাদের তারিখগুলি আলাদা হয়। উপরের মাইকেল লা ভয়ে থেকে আরও ভাল জেনারেল মাইএসকিউএল ক্যোয়ারী।

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

এই উত্তরটি কি সঠিক? আমি এটি ব্যবহার করার চেষ্টা করেছি, তবে এটি 'হোম' এর জন্য সর্বাধিক নতুন তারিখ সহ রেকর্ডটি নির্বাচন না করে কেবলমাত্র পুরানো তারিখের সাথে রেকর্ড সরিয়ে দেয়। এখানে একটি উদাহরণ রয়েছে: এসকিউএলফিডল
marcin93w

1
@ কিডঅফডিথ - প্রসঙ্গে এবং পোস্টগ্রিসের প্রশ্নের সাথে আমার উত্তর আপডেট করেছেন
শিব

সাথে SQLite, প্রথমটি লা ভিয়ের সংস্করণের তুলনায় অনেক ধীর গতিতে যখন ম্যাচ করা কলামে কোনও সূচক নেই (যেমন "হোম")।
টমাস টেম্পেলম্যান

8

এটি ওরাকলে কাজ করে:

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

1
কীভাবে এটি সর্বোচ্চ তারিখটি বেছে নেয়? তিনি ঘরে বসে দলবদ্ধ হতে বললেন এবং সর্বোচ্চ তারিখের সময়টি নির্বাচন করুন। আমি এটি দেখতে পারি না কিভাবে।
n00b

8
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

8

এসকিউএল সার্ভারের জন্য এটি ব্যবহার করে দেখুন:

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


5

এখানে মাইএসকিউএল সংস্করণ রয়েছে যা কেবলমাত্র একটি প্রবেশিকা মুদ্রণ করে যেখানে কোনও গ্রুপে সদৃশ ম্যাক্স (ডেটটাইম) রয়েছে।

আপনি এখানে পরীক্ষা করতে পারেন http://www.sqlfizz.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 |
+------+------+---------------------+--------+----------+

ব্যবহারকারী ভেরিয়েবল সহ মাইএসকিউএল সংস্করণ

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)

তবুও আমি এই উত্তরটিকে ভালবাসি, কারণ এটি আমাকে এতটা সহায়তা করছে, আমাকে একটি প্রধান ত্রুটির দিকে লক্ষ্য রাখতে হবে, এটি ব্যবহৃত মাইএসকিএল সিস্টেমের উপর নির্ভর করে। মূলত, এই সমাধানটি সাবলেট বাছাইয়ের আদেশের উপর নির্ভর করে। এই মাইল বা মাইলটি বিভিন্ন মাইএসকিএল পরিবেশে কাজ করে না। আমি খাঁটি মাইএসকিউএল তে এটি চেষ্টা করেছি, কিন্তু নিশ্চিত এই MariaDB 10.1 উপর নির্ভরযোগ্যভাবে কাজ না করে, এখানে ব্যাখ্যা stackoverflow.com/questions/26372511/... কিন্তু খুব একই কোড Percona সার্ভার কাজ ঠিক আছে। সুনির্দিষ্টভাবে বলতে গেলে, আপনি টি 1 কলামের পরিমাণের উপর নির্ভর করে আপনার পক্ষে বা একই ফলাফল পেতে পারেন না।
রাদেক

এই বিবৃতিটির উদাহরণ হ'ল মারিয়াডিবি 10.1 এ এটি কাজ করেছিল, যখন আমি টি 1 টেবিল থেকে 5 টি কলাম ব্যবহার করেছি। যত তাড়াতাড়ি আমি ষষ্ঠ কলাম যুক্ত করেছি, স্পষ্টতই মূল টেবিলে "প্রাকৃতিক" ডেটা সাজানোর সাথে জগাখিচুড়ি কাজ শুরু করে। কারণটি হ'ল, উপ-উপাত্তের ডেটা অ-অর্ডারে পরিণত হয়েছে এবং এইভাবে আমি "is_first_appear = 1" শর্তটি বেশ কয়েকবার পূরণ করেছি। খুব একই কোড, একই ডেটা সহ, পেরকোনা ঠিক আছে।
রাদেক

5

সাব কোয়েরি ব্যবহার করে গ্রুপ প্রতি সর্বাধিক সাম্প্রতিক সারিটি জিটি করার আরেকটি উপায় যা মূলত প্রতি গ্রুপে প্রতিটি সারির জন্য একটি র‌্যাঙ্ক গণনা করে এবং তারপরে আপনার সাম্প্রতিক সারিগুলিকে ফিল্টার আউট করে = র‌্যাঙ্কের সাথে 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 টিরও বেশি সারি ফিরবে। এই পরিস্থিতিটি coverাকা দেওয়ার জন্য অন্য কোন মানদণ্ড / প্যারামিটার / কলামের প্রয়োজন হবে যে কোন সারিটি নেওয়া উচিত যা উপরের পরিস্থিতিতে পড়ে। নমুনা ডেটা সেট দেখে আমি ধরে নিয়েছি যে এখানে একটি প্রাথমিক কী কলাম রয়েছে idযা অটো ইনক্রিমেন্টে সেট করা উচিত। সুতরাং আমরা এই কলামটি CASEবিবরণের সাহায্যে একই ক্যোয়ারীটি টুইট করে সর্বাধিক সাম্প্রতিক সারিটি বেছে নিতে ব্যবহার করতে পারি

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মানগুলির মধ্যে সর্বাধিক আইডি সহ সারিটি বেছে নেবে

প্রতিটি সারির জন্য নং র‌্যাঙ্কের জন্য ভিজ্যুয়াল ডেমো


2

কেন ব্যবহার করছেন না: নির্বাচন করুন হোম, ম্যাক্স (তারিখের সময়) হিসাবে ম্যাক্সডেটটাইম, প্লেয়ার, রিসোর্স ফরোম টপটেন গ্রুপ থেকে হোম আমি কি কিছু মিস করেছি?


4
এটি কেবল মাইএসকিউএলের সাথে বৈধ হবে এবং কেবলমাত্র 7.? (?) এর আগে বা 5..7 এর পরে কেবলমাত্র ওয়ানওয়াই_ফুল_গ্রুপ_বিআই অক্ষম রয়েছে, যেহেতু এটি কলামগুলি নির্বাচন করা / সমষ্টি করা হয়নি (খেলোয়াড়, সংস্থান) যার অর্থ মাইএসকিউএল তাদের জন্য এলোমেলোভাবে নির্বাচিত মান সরবরাহ করবে দুটি ফলাফল ক্ষেত্র। এটি প্লেয়ার কলামের জন্য সমস্যা হবে না যেহেতু এটি হোম কলামের সাথে সম্পর্কিত, তবে সংস্থান কলামটি হোম বা ডেটটাইম কলামের সাথে সম্পর্কযুক্ত করবে না এবং আপনি কোন উত্সের মান পাবেন তা আপনি গ্যারান্টি দিতে পারেন না।
সরল ব্যবহারকারী

ব্যাখ্যার জন্য +1, তবে জিজ্ঞাসিত প্রশ্নটি কব্জি করে এই কোয়েরিটি expectedমাইএসকিউএল সংস্করণ 5.6 এ আউটপুটটি ফিরিয়ে দেবে না beforeএবং আমি মাইএসকিউএল সংস্করণ 5.7 এবং এ অন্যথায় আচরণ করতে অত্যন্ত সন্দেহ করি after
13:58 এ স্যাটিউ করুন

@ সিম্প্লিউসার, home যেহেতু এটি হোম কলামের সাথে সম্পর্কিত? প্লেয়ার কলামের জন্য কোনও সমস্যা হবে না - আপনি আরও ব্যাখ্যা করতে পারেন?
ইসতিয়াক আহমেদ

@ ইসতিয়াকাহেমেড আমি আবারও তাকিয়ে দেখলাম, উক্তিটি ভুল। আমি ভেবেছিলাম প্রতিটি প্লেয়ারের সর্বদা একই রকমের মূল্য থাকে তবে আমি এখন দেখতে পাচ্ছি যে তারা তা করে না, তাই একই
কান্ডমের

1

এটা চেষ্টা কর

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

শ্রদ্ধা কে


5
এটি স্বতন্ত্রভাবে পরীক্ষা করুন, যদি দুটি ঘরে সমান সর্বোচ্চ ডেটটাইম একই বাড়িতে থাকে (বিভিন্ন খেলোয়াড়ের সাথে)
ম্যাকসেম গোঁটার

উপন্যাসটি max(datetime) হ'ল datetime। এতে কোন সমস্যা হবে না?
ইসতিয়াক আহমেদ

কিভাবে সর্বোচ্চ datetimeনির্বাচিত হয়?
ইসতিয়াক আহমেদ

1

এটি আপনার প্রয়োজনীয় ক্যোয়ারী:

 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;

আপনি আপনার উত্তর ব্যাখ্যা করতে পারেন?
ইসতিয়াক আহমেদ

1

@ মিচা গৃহীত উত্তর বেশিরভাগ ক্ষেত্রেই ঠিকঠাক কাজ করবে তবে এটি নীচের হিসাবে একটির জন্য ব্যর্থ।

যদি 2 টি সারি হোমিড এবং ডেটটাইম সমতুল্য থাকে তবে কোয়েরিটি উভয় সারিই ফিরিয়ে আনবে, প্রয়োজন অনুযায়ী স্বতন্ত্র হোমআইডি নয়, এর জন্য নীচে হিসাবে কোয়েরিতে ডিস্টিনেক্ট যুক্ত করুন।

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

ফলাফল শো - "# 1054 - 'ক্ষেত্রের তালিকায়' অজানা কলাম 'tt.MaxDateTime'"
ইসতিয়াক আহমেদ

@ ইসতিয়াক আহমেদ আপনারা কি ম্যাক্সডেটটাইম দায়ের করেছেন অর্থাৎ এর মতো কোনও কলামের নাম ..?
মনোজ কার্গেটি

না, ওপিতে টেবিলের এমন কোনও কলাম নেই।
ইসতিয়াক আহমেদ

ত্রুটিও একই বলছে দয়া করে..আপনি ঠিক কী করতে চান? আপনি কি টেবিল কাঠামো এবং আপনার ক্যোয়ারী প্রেরণ করতে পারেন?
মনোজ কার্গেটি

1

আশা করি নীচের জিজ্ঞাসাটি পছন্দসই আউটপুট দেবে:

Select id, home,datetime,player,resource, row_number() over (Partition by home ORDER by datetime desc) as rownum from tablename where rownum=1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.