যেখানে গণনা> 1 রেকর্ড সন্ধানের জন্য এসকিউএল কোয়েরি


176

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

আপডেট: অতিরিক্তভাবে, কেবলমাত্র এমন রেকর্ড গণনা করা থেকে একটি ফিল্টার থাকা উচিত যার পিন কোডটি আলাদা।

টেবিলটি এমনভাবে দেখায়:

| ব্যবহারকারী_আইডি | অ্যাকাউন্ট_না | জিপ | তারিখ |
| 1 | 123 | 55555 | 12-ডিসি -09 |
| 1 | 123 | 66666 | 12-ডিসি -09 |
| 1 | 123 | 55555 | 13-ডিসি -09 |
| 2 | 456 | 77777 | 14-ডিসি -09 |
| 2 | 456 | 77777 | 14-ডিসি -09 |
| 2 | 789 | 77777 | 14-ডিসি -09 |
| 2 | 789 | 77777 | 14-ডিসি -09 |

ফলাফলটি এর সাথে দেখতে হবে:

| ব্যবহারকারী_আইডি | গণনা |
| 1 | 2 |

এসকিউএল কোয়েরিতে আপনি কীভাবে এটি প্রকাশ করবেন? আমি স্ব-যোগদানের কথা ভাবছিলাম তবে কোনও কারণে আমার গণনাটি ভুল।

উত্তর:


345

সারিটি অনন্য করে তোলে এমন ক্ষেত্রগুলি দ্বারা HAVING ক্লজ এবং GROUP ব্যবহার করুন

নীচে পাবেন

সমস্ত অ্যাকাউন্টে একই অ্যাকাউন্ট নম্বর সহ প্রতিদিন একাধিক অর্থ প্রদান রয়েছে

SELECT 
 user_id ,
 COUNT(*) count
FROM 
 PAYMENT
GROUP BY
 account,
 user_id ,
 date
Having
COUNT(*) > 1

আপডেট আপনি যদি কেবল একটি পৃথক জিপযুক্তদের অন্তর্ভুক্ত করতে চান তবে প্রথমে একটি স্বতন্ত্র সেট পেতে পারেন এবং তারপরে আপনাকে গ্রুপ / গ্রুপ পরিচালনা করতে পারেন

 SELECT 
    user_id,
    account_no , 
    date,
        COUNT(*)
 FROM
    (SELECT DISTINCT
            user_id,
            account_no , 
            zip, 
            date
         FROM
            payment 

        ) 
        payment
 GROUP BY

    user_id,
    account_no , 

    date
HAVING COUNT(*) > 1

1
তার ফলাফলগুলিতে নোটিশের 2একটি গণনা রয়েছে 4- আপনি Account_noআমার মনে হয় এমন গ্রুপিং বাতিল করতে চাইবেন ।
জেএনকে

অপেক্ষা নেই আমি মনে করি আসলটি সঠিক ছিল "সমস্ত অ্যাকাউন্টে একই অ্যাকাউন্ট নম্বর দিয়ে প্রতিদিন একাধিক অর্থ প্রদান করা হয়" "
কনরাড ফ্রিক্স

এটি বলে যে তবে তার ফলাফলগুলি অন্যথায় প্রদর্শন করে। একটি নোট সহ উভয় সংস্করণ থাকতে পারে।
জেএনকে

আপনার প্রতিক্রিয়া জন্য ধন্যবাদ। আমি মনে করি এটি করা উচিত। আমি যদি এখন অন্য একটি ফিল্টার যুক্ত করতে চাইতাম যা বিলিং জিপ কোড (একই টেবিল, বিভিন্ন কলাম) একই তারিখের জন্য পৃথক কিনা তা পরীক্ষা করে দেখি আমি কীভাবে এই কোয়েরিটি সংশোধন করব?
বেনিয়ামিন মুশকো

আমি নমুনা আউটপুট সমাধান করতে পারি না। আমরা যদি অ্যাকাউন্টটি ফেলে রাখি তবে আমরা তিনটি সারি পেয়ে যাব। আমরা যদি তারিখ এবং অ্যাকাউন্ট উভয়ই ড্রপ করি তবে আমরা দুটি সারি 1,3 এবং 2,4 পেতে চাই। সুতরাং আমি এগিয়ে যেতে এবং আউটপুট উপর শব্দ বিশ্বাস করতে যাচ্ছি
কনরাড ফ্রিক্স

43

এই কোয়েরিটি চেষ্টা করে দেখুন:

SELECT column_name
  FROM table_name
 GROUP BY column_name
HAVING COUNT(column_name) = 1;

4
ঝরঝরে, কিন্তু এটি প্রশ্নের উত্তর দেয় না
লাম্বার্ট

4

আমি HAVINGnewbies জন্য কীওয়ার্ডটি সুপারিশ করব না , এটি মূলত উত্তরাধিকারের উদ্দেশ্যে

এই টেবিলটির কী কী তা সম্পর্কে আমি পরিষ্কার নই (এটি কি পুরোপুরি স্বাভাবিক করা হয়েছে , আমি অবাক হয়েছি?), ফলস্বরূপ আপনার স্পেসিফিকেশনটি অনুসরণ করা আমার পক্ষে কঠিন:

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

সুতরাং আমি একটি আক্ষরিক ব্যাখ্যা গ্রহণ করেছি।

নিম্নলিখিতটি আরও ভার্বোজ তবে এটি বোঝা এবং বজায় রাখা আরও সহজ হতে পারে (আমি টেবিলের জন্য একটি সিটিই ব্যবহার করেছি PAYMENT_TALLIESতবে এটি একটি হতে পারে VIEW:

WITH PAYMENT_TALLIES (user_id, zip, tally)
     AS
     (
      SELECT user_id, zip, COUNT(*) AS tally
        FROM PAYMENT
       GROUP 
          BY user_id, zip
     )
SELECT DISTINCT *
  FROM PAYMENT AS P
 WHERE EXISTS (
               SELECT * 
                 FROM PAYMENT_TALLIES AS PT
                WHERE P.user_id = PT.user_id
                      AND PT.tally > 1
              );

2
create table payment(
    user_id int(11),
    account int(11) not null,
    zip int(11) not null,
    dt date not null
);

insert into payment values
(1,123,55555,'2009-12-12'),
(1,123,66666,'2009-12-12'),
(1,123,77777,'2009-12-13'),
(2,456,77777,'2009-12-14'),
(2,456,77777,'2009-12-14'),
(2,789,77777,'2009-12-14'),
(2,789,77777,'2009-12-14');

select foo.user_id, foo.cnt from
(select user_id,count(account) as cnt, dt from payment group by account, dt) foo
where foo.cnt > 1;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.