पता नहीं, अगर मैं इसे सही तरीके से समझ पाऊं...
सबसे पहले तो ऐसा लगता है कि यहाँ एक स्पष्ट गलती है:
WHEN t.bucket > 60 AND t.bucket <=90 THEN 'NULL'
क्या यह नहीं होना चाहिए:
WHEN t.bucket >90 THEN 'NULL'
समारोह NTILE
आपके सेट को बाल्टियों में भी फैला देगा। मेरा आउटपुट जांचें और पता लगाएं कि यह कोने-मामलों में कैसे व्यवहार करता है। मेरा सुझाव है कि प्रति पंक्ति परिकलित प्रतिशत का उपयोग यहां की तरह करें:
WITH tally
(vals, bucket)
AS
(
SELECT
DATEADD(DAY, - ROW_NUMBER() OVER (ORDER BY (SELECT NULL)), GETDATE())
,NTILE(100) OVER (ORDER BY (SELECT NULL))
FROM
(
VALUES (0), (0), (0), (0), (0), (0), (0), (0), (0)) AS a(n)
CROSS JOIN (VALUES (0), (0), (0), (0), (0), (0), (0), (0), (0)) AS b(n)
CROSS JOIN (VALUES (0), (0), (0), (0), (0), (0), (0), (0), (0)) AS c(n)
)
SELECT *
INTO #tmpBuckets
FROM Tally;
--मैं इस #tmpBuckets-table का उपयोग आपके मेरे पास एक टेबल . के करीब जाने के लिए करता हूं परिदृश्य
WITH Numbered AS
(
SELECT *
,ROW_NUMBER() OVER(ORDER BY vals DESC) / ((SELECT COUNT(*) FROM #tmpBuckets)/100.0) AS RunningPercentage
FROM #tmpBuckets
)
,ComputeBuckets AS
(
SELECT
t.*
, CASE
WHEN t.RunningPercentage <= 35 THEN 'a'
WHEN t.RunningPercentage > 35 AND t.RunningPercentage <=60 THEN 'b'
WHEN t.RunningPercentage > 60 AND t.RunningPercentage <=90 THEN 'c'
WHEN t.RunningPercentage >90 THEN 'NULL'
END AS ShnugoMethod
, CASE
WHEN t.bucket <= 35 THEN 'a'
WHEN t.bucket > 35 AND t.RunningPercentage <=60 THEN 'b'
WHEN t.bucket > 60 AND t.RunningPercentage <=90 THEN 'c'
WHEN t.bucket > 90 THEN 'NULL'
END AS ZikatoMethod
FROM Numbered t
)
SELECT cb.*
FROM ComputeBuckets cb
ORDER BY cb.vals DESC
GO
DROP TABLE #tmpBuckets;
मुझे लगता है कि आप जानते हैं, स्रोत तालिका को अद्यतन करने के लिए ऐसे सीटीई का उपयोग कैसे करें। अन्यथा एक और प्रश्न के साथ वापस आएं :-)