একটি কলামে DISTINCT এবং শীর্ষ সারিতে ফিরে আসুন


9

আপনি সবচেয়ে বড় তিনটি অনন্য গ্রাহকের জন্য কীভাবে জিজ্ঞাসা করবেন Purchase_Cost?

আমি DISTINCTকেবলমাত্র প্রয়োগ করতে চাই Customer_Name, তবে নীচের কোয়েরিটি তিনটি কলামে স্বতন্ত্র প্রয়োগ করে। পছন্দসই আউটপুট পেতে কীভাবে আমার ক্যোয়ারীটি সংশোধন করা উচিত?

SELECT DISTINCT TOP 3 customer_name, order_no, Purchase_Cost  
FROM PurchaseTable 
ORDER BY Purchase_Cost

এখানে চিত্র বর্ণনা লিখুন

উত্তর:


9

নীচের ক্যোয়ারিতে আপনার ডিবি নাম এবং স্কিমা নামটি প্রতিস্থাপন করুন।

;WITH CTE AS 
(
SELECT  
       [Order_No]
      ,[Customer_Name]
      ,[Purchase_Cost]
     , ROW_NUMBER() OVER(PARTITION BY [customer Name] ORDER BY [Purchase Cost] DESC) AS "RowNumber"
  FROM [dbname].[schemaName].[PurchaseTable]
  )

  SELECT TOP(3)
       [Order_No]
      ,[Customer_Name]
      ,[Purchase_Cost]
  FROM CTE WHERE RowNumber=1
  ORDER BY [Purchase_Cost] DESC

আমি নিশ্চিত যে এটি করার অন্যান্য উপায় আছে। আমি আপনাকে পরামর্শ দিচ্ছি আপনি পড়তে এই


1

চেষ্টা করুন:

SELECT DISTINCT TOP 3  order_no, customer_name,  Purchase_Cost
FROM
(   SELECT order_no, customer_name, Purchase_Cost, ROW_NUMBER() OVER(PARTITION BY customer_name ORDER BY Purchase_Cost DESC) Orders
    FROM PurchaseTable
) A
WHERE A.Orders = 1
ORDER BY Purchase_Cost DESC

0

আমি মনে করি এটি অন্য কার্যকরগুলির চেয়ে আরও কার্যকরী হতে পারে তবে শর্ত থাকে যে আপনি যদি একটি সূচক থাকে:

;
WITH PurchaseTable AS
(
    SELECT * 
      FROM (VALUES ((501),('Carson'),(3400)),
                   ((502),('Thomas'),(625)),
                   ((503),('Daisy'),(4856)),
                   ((504),('Mary'),(2397)),
                   ((505),('Carson'),(5000))
           ) AS T(Order_No,Customer_Name,Purchase_Cost)
),
DistinctCustomers AS
(
    SELECT DISTINCT
           Customer_Name
      FROM PurchaseTable
)
SELECT TOP(3) 
       MaxCustomerOrder.Order_No,
       dc.Customer_Name,
       MaxCustomerOrder.Purchase_Cost
  FROM DistinctCustomers dc
 CROSS APPLY (SELECT TOP(1) * 
                FROM PurchaseTable pt 
               WHERE pt.Customer_Name = dc.Customer_Name 
               ORDER BY pt.Purchase_Cost DESC
             )    AS MaxCustomerOrder
 ORDER BY MaxCustomerOrder.Purchase_Cost DESC
;

অথবা ইনলাইন টেবিল সংজ্ঞা ছাড়াই:

;
WITH DistinctCustomers AS
(
    SELECT DISTINCT
           Customer_Name
      FROM PurchaseTable
)
SELECT TOP(3) 
       MaxCustomerOrder.Order_No,
       dc.Customer_Name,
       MaxCustomerOrder.Purchase_Cost
  FROM DistinctCustomers dc
 CROSS APPLY (SELECT TOP(1) * 
                FROM PurchaseTable pt 
               WHERE pt.Customer_Name = dc.Customer_Name 
               ORDER BY pt.Purchase_Cost DESC
             )    AS MaxCustomerOrder
 ORDER BY MaxCustomerOrder.Purchase_Cost DESC
;

প্রথম ক্যোয়ারীটি বৈধ বলে মনে হচ্ছে না।
dezso

আমি এটি ঠিক করার চেষ্টা করেছি। 1 এবং 2 এর ক্যোয়ারীর মধ্যে পার্থক্য কি তা নিশ্চিত নয়
ypercubeᵀᴹ

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