দলের জন্য শর্ত পূরণ করে সারিগুলি নির্বাচন করুন (অস্থায়ী টেবিল ছাড়াই)


10

3 টি কলাম সহ টেবিল থাকা:

ID  category    flag
1       A       1
2       A       0
3       A       0
4       B       0
5       C       0

আমি flag = 1প্রতি বিভাগে কমপক্ষে একবারে থাকা সমস্ত সারি নির্বাচন করতে চাই ।

প্রত্যাশিত ফলাফল:

ID  category    flag
1       A       1
2       A       0
3       A       0

এটি একটি অস্থায়ী টেবিল ব্যবহার করে সমাধান করা যেতে পারে:

select ID into #tempTable from someTable where flag = 1
select * from someTable join #tempTable on someTable.ID = #tempTable.ID

তবে আমি গ্রুপিংয়ের সাথে একটি সমাধান পছন্দ করবো, যার সমাধানে আমি লড়াই করছি। যে কোন ধরণের সাহায্য গ্রহন করা হবে.

উত্তর:


16

GROUP BYএটি এককভাবে ব্যবহার করা যায় না কারণ এটি প্রতি গ্রুপে (1 category) সারি দেয় ।


  • আপনার সাথে একটি সাব ক্যোয়ারী ব্যবহার করতে পারেন flag = 1এবং INNER JOIN:

    SELECT d1.ID, d1.category, d1.flag
    FROM data d1
    INNER JOIN (
        SELECT DISTINCT category FROM data WHERE flag = 1
    ) d2 
        ON d2.category = d1.category ;
  • আপনি এই EXISTSধারাটি ব্যবহার করতে পারেন :

    SELECT d.ID, d.category, d.flag
    FROM data d
    WHERE EXISTS (
        SELECT 1 FROM data WHERE flag = 1 AND category = d.category
    ) ;   
  • আপনি INধারাটি ব্যবহার করতে পারেন (যদিও EXISTSএটি আরও ভাল):

    SELECT d.ID, d.category, d.flag
    FROM data d
    WHERE d.category IN (SELECT category FROM data WHERE flag = 1) ;
  • আপনি এখানে CROSS APPLYএকটি সাব কোয়েরি ব্যবহার করতে পারেন flag = 1:

    SELECT d.ID, d.category, d.flag
    FROM data d
    CROSS APPLY (
        SELECT TOP (1) category 
        FROM data 
        WHERE flag = 1 AND category = d.category
    ) ca ;

DISTINCTপ্রয়োজন নেই যদি প্রতিটি বিভাগের জন্য কেবল 1 সারি থাকতে পারে flag = 1

আউটপুট:

ID  category    flag
1       A       1
2       A       0
3       A       0

ডিআইএনএসএনসিটি আইএন প্রিপিকেটের জন্য অপ্রয়োজনীয়। এবং প্রতি বিভাগে কেবল একটি সারিতে 1 টি পতাকা থাকতে পারে তবে DISTINCT একেবারেই অপ্রয়োজনীয়।
অ্যান্ড্রি এম

INক্যোয়ারী সম্পর্কে @AndriyM ঠিক আছে । তবে ওপিতে রয়েছে " আমি প্রতি বিভাগে কমপক্ষে একবারে পতাকা = 1 রয়েছে এমন সমস্ত সারি নির্বাচন করতে চাই " যা আমাকে মনে করে যে DISTINCTঅন্যান্য প্রশ্নের জন্য এটি প্রয়োজনীয়।
ypercubeᵀᴹ

1
এবং এর মধ্যে CROSS APPLY, SELECT DISTINCT categoryপ্রতিস্থাপন করা হলে সম্ভবত আরও কার্যকর হওয়া উচিত SELECT TOP (1) whateverEXISTSসাবউয়েরি লেখার এটি অন্যভাবে কার্যকরভাবে হবে ।
ypercubeᵀᴹ

@ অ্যান্ড্রি এই কারণেই গতকাল আমি আপনার প্রাথমিক মন্তব্যের ভিত্তিতে একটি নোট যুক্ত করেছি: পতাকা সহ কেবলমাত্র 1 টি সারি থাকলে প্রয়োজন হয় না = 1
জুলিয়েন ভাওয়াসুর

4

ধরে নিই যে Flagএটি একটি BITকলাম বা একটি INTযা কেবল 0এবং 1মান হিসাবে নেয় , এটি উইন্ডোযুক্ত ফাংশনগুলি ব্যবহার করেও অর্জন করা যেতে পারে। এই ক্ষেত্রে:

DECLARE @Test TABLE
(
  ID INT
  , Category VARCHAR(1)
  , Flag BIT
);

INSERT INTO @Test (ID, Category, Flag)
VALUES (1, 'A', 1)
  , (2, 'A', 0)
  , (3, 'A', 0)
  , (4, 'B', 0)
  , (5, 'C', 0);

SELECT T.ID
  , T.Category
  , T.Flag
FROM (
  SELECT ID
    , Category
    , Flag
    , MAX(CAST(Flag AS TINYINT)) OVER(PARTITION BY Category) AS MaxFlag
  FROM @Test
  ) AS T
WHERE T.MaxFlag = 1;

এটাই আউটপুট:

ID Category Flag  
-- -------- ----- 
1  A        True  
2  A        False 
3  A        False 

এটি Flagআপনার টেবিলের প্রতিটি বিভাগের জন্য সর্বাধিক সন্ধান করবে , আপনার ক্ষেত্রে এটি সম্ভবত সত্য / মিথ্যা এবং কেবলমাত্র একজনকে বেছে নেবে true(1)

রূপান্তর TINYINTপ্রয়োজন কারণ MAXএকটি BITযুক্তি গ্রহণ করে না ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.