2010-08-17 15 views
10

मैं SQL फ़ंक्शन में एक नौसिखिया हूं। SQL सर्वर में फैक्टरियल के लिए फ़ंक्शन बनाने का सबसे अच्छा तरीका क्या है- 10 कहें!एसक्यूएल फ़ंक्शंस - फैक्टोरियल

+2

क्या इसे वास्तव में एसक्यूएल होने की आवश्यकता है? मुझे लगता है कि वहाँ अन्य बेहतर विकल्पों का एक टन होगा। –

+0

प्रतिक्रिया के लिए धन्यवाद हाँ, यह एसक्यूएल होना चाहिए।मैं SQL सर्वर पर फ़ंक्शंस सीख रहा हूं, यह कोई होमवर्क नहीं है, मैं एक फ़ंक्शन नमूना पेपर को हल करके स्वयं अभ्यास कर रहा हूं, मुझे ऑनलाइन – Jason

उत्तर

10

यहाँ एक पुनरावर्ती समाधान है:,

CREATE FUNCTION dbo.Factorial (@iNumber int) 
RETURNS INT 
AS 
BEGIN 
DECLARE @i int 

    IF @iNumber <= 1 
     SET @i = 1 
    ELSE 
     SET @i = @iNumber * dbo.Factorial(@iNumber - 1) 
RETURN (@i) 
END 
+0

मिला है, मुझे लगता है कि यहां 'बिगिनट' का उपयोग करना एक सुधार होगा –

17

एक गैर पुनरावर्ती रास्ता

;With Nums As 
(
select ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS RN 
FROM sys.objects 
) 
SELECT POWER(10.0, SUM(LOG10(RN))) 
FROM Nums 
WHERE RN <= 10 

और एक पुनरावर्ती रास्ता

declare @target int 
set @target=10; 

WITH N AS 
    (SELECT 1 AS i, 
      1 AS f 

    UNION ALL 

    SELECT i+1, 
      f*(i+1) 
    FROM N 
    WHERE i < @target 
    ) 
SELECT f FROM N 
WHERE [email protected] 
0

मैं जानता हूँ कि मैं देर से यहाँ एक छोटे से कर रहा हूँ, लेकिन यह ध्यान देने योग्य है कि मार्टिन द्वारा पोस्ट किया गया रिकर्सिव तरीका 0

के लिए काम नहीं करता है


declare @target int=3; 

WITH N AS 
(SELECT 1 AS i, 
     1 AS f 
UNION ALL 
SELECT i+1, 
     f*(i+1) 
FROM N 
WHERE i < @target), 
N0 AS 
(SELECT f FROM N WHERE [email protected] UNION SELECT 0) 
SELECT MAX(f) FROM N0 

और जिस तरह के लिए, जिस तरह से तेजी से संस्करण:

यह होगा (मुझे माफ कर दो, मैं कोड पोस्टिंग मुद्दों कर रहा था)

declare @target int=5; 

WITH N AS 
(SELECT 1 AS i, 
     1 AS f 
UNION ALL 
SELECT i+1, 
     f*(i+1) 
FROM N 
WHERE i < @target), 
N0 AS 
(SELECT f FROM N WHERE [email protected] UNION SELECT f=CASE WHEN @target=0 THEN 0 END) 
SELECT f FROM N0 
WHERE f>=0 

यह बहुत तेजी से है, क्योंकि मैं MAX() फ़ंक्शन को खो दें, जो शीर्ष 1 की तरह है, एक DISTINCT प्रकार का कारण बनता है।

1

... मेरे सेट आधारित पद्धति के लिए:

DECLARE @n int=11, @f bigint=1; 

WITH 
t(n,f) AS (SELECT TOP(@n) 
     ROW_NUMBER() OVER (ORDER BY (SELECT NULL))+1, 
     ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) * 
     (ROW_NUMBER() OVER (ORDER BY (SELECT NULL))+1) 
    FROM sys.all_columns 
    UNION SELECT 1, f=CASE WHEN @n=0 THEN 0 ELSE 1 END) 
SELECT @[email protected]*f 
FROM t 
WHERE n%[email protected]%2 OR f=0; 


SELECT @f AS FACTORIAL; 
3

- Iterative विधि। - क्यों Iterative? यह सरल और तेज़ है। - 0 से 20 तक @N के लिए यह एक सटीक परिणाम देता है। - 21 एक अतिप्रवाह देगा।

DECLARE @N Bigint = 20 
DECLARE @F Bigint = 1 
WHILE @N > 0 BEGIN 
    SET @F = @f*@n 
    SET @N = @N-1 
END 
SELECT @F AS FACTORIAL 

- डेटाप्रकार फ्लोट करने के लिए परिवर्तित करें और आप के लिए 170. भाज्य प्राप्त कर सकते हैं - 171 एक अतिप्रवाह का परिणाम देगा। - परिणाम को सीमित करें केवल सीमित संख्या में स्थितियों पर सटीक होगा।

DECLARE @N FLOAT = 170 
DECLARE @F FLOAT = 1 
WHILE @N > 0 BEGIN 
    SET @F = @f*@n 
    SET @N = @N-1 
END 
SELECT @F AS FACTORIAL 

- बेन

1

इस

WITH MYCTE AS(
SELECT VAL=1,NUM =6 
UNION ALL 
SELECT VAL=VAL*NUM,NUM = (NUM -1) 
FROM MYCTE 
WHERE NUM > 1 
)     
SELECT VAL FROM MYCTE 
0

यहाँ की कोशिश करो calculate factorial value of an integer in SQL Server

create function sqlFactorial (@int int) 
returns int 
begin 
    declare @factorial bigint = 1 
    select @factorial = @factorial * i from dbo.NumbersTable(1,@int,1) 
    return @factorial 
end 

आप इस समाधान के लिए एक SQL numbers table उपयोग करने की आवश्यकता के लिए एक अन्य तरीका है। चयन कथन प्रत्येक भाग के लिए घोषित पूर्णांक चर अद्यतन करता है जिसमें इसे क्रमिक पूर्णांक मान

0

यदि आप अनुमान के साथ ठीक हैं, तो Stirling's Approximation का उपयोग करें।

create table #temp (value int) 

insert into #temp values (5),(6),(7),(8) 

select 
    value, 
    sqrt(2*3.14*value)*power((value/2.718),value) --stirling's approx. 
from #temp 

ध्यान दें कि यदि आवश्यक हो तो आपको 0 के लिए केस बनाना होगा।

+0

यदि @ जेसन का शाब्दिक अर्थ है उपयोगकर्ता द्वारा परिभाषित एसक्यूएल-सर्वर में फ़ंक्शन, आप किसी तालिका चर के अलावा फ़ंक्शन के अंदर एक तालिका को परिभाषित नहीं कर सकते हैं। http://stackoverflow.com/questions/11267804/create-drop-and-insert-a-temp-table-in-a-user-defined-function – Jake

संबंधित मुद्दे