我是SQL函數的初學者。 在SQL Server中爲factorial創建函數的最佳方式是什麼 - 說10!SQL函數 - 階乘
回答
這裏是一個遞歸解決方案:
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
我認爲在這裏使用'BIGINT'會是一個改進 – 2017-02-22 14:42:29
非遞歸的方式
;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]
我知道我是一個有點晚了這裏,但值得注意的是,Martin發佈的遞歸方式不適用於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()函數,就像top 1一樣,導致DISTINCT排序。
...我的Set-based的方法:
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;
- 迭代方法。 - 爲什麼迭代?它更簡單快捷。 - 對於從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
- 本
試試這個
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
這裏是一個其他的方法來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此解決方案。 Select語句將FROM部分中每行的已聲明整數變量與有序整數值相乘
如果您對近似值沒有問題,請使用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!的情況。
如果@Jason字面意思是用戶定義函數在sql-server中,除了表變量之外,你不能在函數內定義一個表。 http://stackoverflow.com/questions/11267804/create-drop-and-insert-a-temp-table-in-a-user-defined-function – Jake 2017-01-03 20:44:56
- 1. haskell:使用高階函數的階乘
- 2. 問題的階乘函數
- 3. 階乘函數遞歸
- 4. 遞歸階乘函數
- 5. SQL 2008中的遞歸函數計算一個數的階乘
- 6. 大整數乘法(階乘)
- 7. Prolog遞歸(功率函數的階乘)
- 8. 通過DnC計算階乘函數
- 9. IO monad haskell中的階乘函數
- 10. 無論如何去逆階乘函數?
- 11. 簡單的遞歸階乘函數
- 12. 大數的階乘
- 13. 大數的階乘
- 14. PHP函數的階乘,但使用加法而不是乘法?
- 15. 計算階乘
- 16. 遞歸:階乘
- 17. 階乘問題
- 18. 階乘算法
- 19. Python和階乘
- 20. 階乘限制
- 21. Python和與分數階乘
- 22. C++零的階乘數
- 23. 階乘和分的模數
- 24. 階乘170+
- 25. 階乘一些
- 26. 階乘零,錯誤?
- 27. 階乘for循環
- 28. 階乘使用FFT
- 29. SPOJ階乘問題
- 30. Java階乘輸出
它確實需要SQL嗎?在我看來,那裏會有很多其他更好的選擇。 – 2010-08-17 16:57:16
感謝您的回覆 是的,它必須是SQL。我正在學習SQL Server上的函數 沒有它不是作業,我正在通過解決我在網上找到的函數示例文件來做自我練習 – Jason 2010-08-17 17:16:02