ওভারের সাথে উইন্ডো ফাংশনে DISTINCT ব্যবহার করা


18

আমি ওরাকল থেকে এসকিউএল সার্ভার 2014 এ কোনও ক্যোয়ারী স্থানান্তরিত করার চেষ্টা করছি।

এখানে আমার জিজ্ঞাসাটি যা ওরাকলে দুর্দান্ত কাজ করে:

select
count(distinct A) over (partition by B) / count(*) over() as A_B
from MyTable 

এসকিউএল সার্ভার ২০১৪-এ এই কোয়েরিটি চালানোর চেষ্টা করার পরে আমি যে ত্রুটি পেয়েছি তা এখানে।

Use of DISTINCT is not allowed with the OVER clause

কেউ কি জানেন সমস্যা কি? এসকিউএল সার্ভারে কি কি ধরণের কোয়েরি সম্ভব? দয়া করে উপদেশ দাও.


আপনি MyTableকি প্রতিটি সারির জন্য ফলাফলের জন্য আসলে একটি সারির প্রয়োজন ? বা স্বতন্ত্র সারি যথেষ্ট? এবং যদি কোনও সারি নেই তবে আপনার শূন্য ত্রুটি দ্বারা বিভাগটি বিবেচনা করার দরকার নেইMyTable ?
এরউইন ব্র্যান্ডসেটেটার

উত্তর:


12

কেউ কি জানেন সমস্যা কি? এসকিউএল সার্ভারে কি কি ধরণের কোয়েরি সম্ভব?

না এটি বর্তমানে কার্যকর করা হয়নি। নিম্নলিখিত সংযোগ আইটেম অনুরোধ দেখুন।

ওভার ক্লজ বর্ধনের অনুরোধ - সামগ্রিক ফাংশনগুলির জন্য DISTINCT ধারা

অন্য সম্ভাব্য রূপটি হবে

SELECT M.A,
       M.B,
       T.A_B
FROM   MyTable M
       JOIN (SELECT CAST(COUNT(DISTINCT A) AS NUMERIC(18,8)) / SUM(COUNT(*)) OVER() AS A_B,
                    B
             FROM   MyTable
             GROUP  BY B) T
         ON EXISTS (SELECT M.B INTERSECT SELECT T.B) 

কাস্ট NUMERICএড়ানোর পূর্ণসংখ্যা বিভাজন নেই। যোগদানের ধারাটির কারণ এখানে ব্যাখ্যা করা হয়েছে

এটা দিয়ে প্রতিস্থাপিত হতে পারে ON M.B = T.B OR (M.B IS NULL AND T.B IS NULL)যদি পছন্দের (বা শুধু ON M.B = T.Bযদি Bকলাম nullable নয়)।


14

এটি বি দ্বারা বিভক্ত একটি পৃথক গণনা (*) দেয়:

dense_rank() over (partition by B order by A) 
+ dense_rank() over (partition by B order by A desc) 
- 1

3
আকর্ষণীয় সমাধান। আমি মনে করি এটির অস্বীকৃতি থাকা উচিত যা Aকেবল তখনই অযোগ্য হয় (যখন আমি মনে করি এটি নালগুলিও গণনা করে) works
ypercubeᵀᴹ

এটা abs(dense_rank - dense_rank) + 1আমার বিশ্বাস হওয়া উচিত ।
নর্চল্লি

7

dense_rank()বি দ্বারা বিভাজনিত A এর স্বতন্ত্র গণনা পেতে আপনি সর্বোচ্চ মান নিতে পারেন

first_valueবিভাজনে কোনও নাল উপস্থিত রয়েছে কিনা তা নির্ধারণ করতে আপনি এটির নাল মান থাকতে পারে এমন ক্ষেত্রে যত্ন নেওয়ার জন্য এবং তারপরে মন্তব্যে মার্টিন স্মিথের পরামর্শ অনুসারে 1 বিয়োগ করতে হবে।

select (max(T.DenseRankA) over(partition by T.B) - 
          cast(iif(T.FirstA is null, 1, 0) as numeric(18, 8))) / T.TotalCount as A_B
from (
     select dense_rank() over(partition by T.B order by T.A) DenseRankA,
            first_value(T.A) over(partition by T.B order by T.A) as FirstA,
            count(*) over() as TotalCount,
            T.A,
            T.B
     from MyTable as T
     ) as T

5

A, B দ্বারা গোষ্ঠীকরণ এবং গণনা সহ একটি সাবকিউরি করার চেষ্টা করুন। তারপরে আপনার বাহ্যিক ক্যোয়ারিতে আপনার গণনা (স্বতন্ত্র) একটি নিয়মিত গণিতে পরিণত হয় এবং আপনার গণনা (*) যোগফল (সিএনটি) হয়ে যায়।

select
count(A) over (partition by B) * 1.0 / 
    sum(cnt) over() as A_B
from
(select A, B, count(*) as cnt
 from MyTable
 group by A, B) as partial;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.