मुझे SQL क्वेरी का उपयोग करके अनुक्रम उत्पन्न करने की आवश्यकता है।

अनुक्रम इस तरह होना चाहिए:

1 2 2 3 3 3 4 4 4 4 ...

-1
user10747759 5 नवम्बर 2020, 10:29

2 जवाब

सबसे बढ़िया उत्तर

यदि आप किसी रिकर्सन का उपयोग नहीं करना चाहते हैं, तो यह सूत्र गणित स्टैक एक्सचेंज वेबसाइट। क्रम 0 के मान से शुरू होना चाहिए।

एक टैली टेबल का प्रयोग करें ताकि ज्यादा से ज्यादा संख्याएं उत्पन्न हो सकें ( मैंने 1000 नंबर का विकल्प चुना)।

WITH Tally (n) AS
(
    -- 1000 rows
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
    FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) a(n)
    CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) b(n)
    CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) c(n)
)
SELECT FLOOR((1 + SQRT(1 + 8 * (t.n - 1))) / 2)
FROM Tally t;

संपादित करें: एक और आसान फॉर्मूला है। यहां, क्रम 1 के मान से शुरू होना चाहिए।

WITH Tally (n) AS
(
    -- 1000 rows
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
    FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) a(n)
    CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) b(n)
    CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) c(n)
)
SELECT ROUND(SQRT(2 * t.n), 0) AS SEQUENCE
FROM Tally t;

इसे क्रिया में देखने के लिए Fiddle देखें।

1
Sander 5 नवम्बर 2020, 11:26

टी-एसक्यूएल संग्रहीत प्रक्रिया में, आप इसे आजमा सकते हैं:

CREATE PROCEDURE sequence
    @count INT
AS  
DECLARE @i INT = 0
DECLARE @j INT = 0
DECLARE @tempTable TABLE(
    a INT
);

WHILE @i < @count
BEGIN
    SET @i = @i + 1
    SET @j = 0
    
    WHILE @j < @i
    BEGIN
        SET @j = @j + 1
        INSERT INTO @tempTable (@i)
    END
END
SELECT a FROM @tablename
GO

WHILE लूप्स का उपयोग करके, अधिकतम मान तक और INSERT काउंट्स को एक अस्थायी तालिका में गिनना संभव है।

0
sbgib 5 नवम्बर 2020, 11:07