[SQL] SQL 함수 - 계승
SQLSQL 함수 - 계승
나는 SQL 함수에서 초보자입니다. 어떤 것은 SQL 서버 - 말 (10)에 계승하는 기능을 만들 수있는 가장 좋은 방법입니다!
해결법
-
==============================
1.여기에 재귀 솔루션입니다 :
여기에 재귀 솔루션입니다 :
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
-
==============================
2.비 재귀 방법
비 재귀 방법
;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 i=@target
-
==============================
3.- 반복적 인 방법. - 왜 반복? 그것은 간단하고 빠르다. - 0 ~ 20 @N를 들어이 정확한 결과를 제공합니다. - (21)는 오버 플로우를 제공 할 것입니다.
- 반복적 인 방법. - 왜 반복? 그것은 간단하고 빠르다. - 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
- 벤
-
==============================
4.이 시도
이 시도
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
-
==============================
5.또 다른 방법:
또 다른 방법:
create function Fact(@num int) returns bigint as begin declare @i int = 1 while @num>1 begin set @i = @num * @i set @num=@num-1 end return @i end select dbo.Fact(5)
-
==============================
6.... 내 설정 기반 방법 :
... 내 설정 기반 방법 :
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 @f=@f*f FROM t WHERE n%2=@n%2 OR f=0; SELECT @f AS FACTORIAL;
-
==============================
7.늦어서 조금 여기있어 알고 있지만, 그것의 가치는 마틴 게시하는 재귀 방법은 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 i=@target 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 i=@target UNION SELECT f=CASE WHEN @target=0 THEN 0 END) SELECT f FROM N0 WHERE f>=0
난 그냥 상위 1처럼 DISTINCT 종류의 원인은 MAX () 함수를 상실하기 때문에 훨씬 더 빨리이다.
-
==============================
8.다음은 SQL 서버의 정수의 계승 값을 계산하는 다른 방법
다음은 SQL 서버의 정수의 계승 값을 계산하는 다른 방법
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 번호 테이블을 사용해야합니다. 선택 문은 값을 정수 순서로 곱으로 부분에서 각 행에 대해 선언 된 정수 변수를 업데이트
-
==============================
9.당신이 근사치로 괜찮 경우, 스털링의 근사치를 사용합니다.
당신이 근사치로 괜찮 경우, 스털링의 근사치를 사용합니다.
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 경우를해야 할 것이다 있습니다.
-
==============================
10.당신은 SQL Server의 계승을위한 기능을 만들 수있는 가장 좋은 방법이다 물었다. 언제나처럼, 그 문맥에 따라 달라집니다. 하지만 당신은 정말 성능 문제가 갈 수있는 가장 좋은 방법은 CLR 사용자 정의 함수로 구현하는 의심의 여지없이 일반적인 의미에서 그것을 의미합니다.
당신은 SQL Server의 계승을위한 기능을 만들 수있는 가장 좋은 방법이다 물었다. 언제나처럼, 그 문맥에 따라 달라집니다. 하지만 당신은 정말 성능 문제가 갈 수있는 가장 좋은 방법은 CLR 사용자 정의 함수로 구현하는 의심의 여지없이 일반적인 의미에서 그것을 의미합니다.
https://docs.microsoft.com/en-us/sql/relational-databases/clr-integration-database-objects-user-defined-functions/clr-user-defined-functions?view=sql-server-2017
당신은 물론 어떤 언어 당신 공상의 기능 자체를 구현할 수 있습니다. 그리고 긴 / BIGINT 정말 (A BIGINT는 최대 20! 21! 산술 오버플 들어갈 수) 계승 기능을 위해 그것을 잘라하지 않습니다.
-
==============================
11./ * 계승 순서를 인쇄 * /
/ * 계승 순서를 인쇄 * /
WITH MYCTE AS( SELECT VAL=1,NUM =1 UNION ALL SELECT VAL=VAL*(NUM+1),NUM = (NUM +1) FROM MYCTE WHERE NUM < 11 ) SELECT VAL FROM MYCTE OPTION (MAXRECURSION 0);
-
==============================
12.MS-SQL : 0 88에서 계승 :
MS-SQL : 0 88에서 계승 :
with tb1 as ( select 10000000 as b, 1 as n, 0 as t18, 0 as t17, 0 as t16, 0 as t15, 0 as t14, 0 as t13, 0 as t12, 0 as t11, 0 as t10, 0 as t9, 0 as t8, 0 as t7, 0 as t6, 0 as t5, 0 as t4, 0 as t3, 0 as t2, 0 as t1, 1 as t0 union all select tb1.b, tb1.n + 1, (tb1.t18 * tb1.n) + ((tb1.t17 * tb1.n) + ((tb1.t16 * tb1.n) + ((tb1.t15 * tb1.n) + ((tb1.t14 * tb1.n) + ((tb1.t13 * tb1.n) + ((tb1.t12 * tb1.n) + ((tb1.t11 * tb1.n) + ((tb1.t10 * tb1.n) + ((tb1.t9 * tb1.n) + ((tb1.t8 * tb1.n) + ((tb1.t7 * tb1.n) + ((tb1.t6 * tb1.n) + ((tb1.t5 * tb1.n) + ((tb1.t4 * tb1.n) + ((tb1.t3 * tb1.n) + ((tb1.t2 * tb1.n) + ((tb1.t1 * tb1.n) + (tb1.t0 * tb1.n) / tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b, ((tb1.t17 * tb1.n) + ((tb1.t16 * tb1.n) + ((tb1.t15 * tb1.n) + ((tb1.t14 * tb1.n) + ((tb1.t13 * tb1.n) + ((tb1.t12 * tb1.n) + ((tb1.t11 * tb1.n) + ((tb1.t10 * tb1.n) + ((tb1.t9 * tb1.n) + ((tb1.t8 * tb1.n) + ((tb1.t7 * tb1.n) + ((tb1.t6 * tb1.n) + ((tb1.t5 * tb1.n) + ((tb1.t4 * tb1.n) + ((tb1.t3 * tb1.n) + ((tb1.t2 * tb1.n) + ((tb1.t1 * tb1.n) + (tb1.t0 * tb1.n) / tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)%tb1.b, ((tb1.t16 * tb1.n) + ((tb1.t15 * tb1.n) + ((tb1.t14 * tb1.n) + ((tb1.t13 * tb1.n) + ((tb1.t12 * tb1.n) + ((tb1.t11 * tb1.n) + ((tb1.t10 * tb1.n) + ((tb1.t9 * tb1.n) + ((tb1.t8 * tb1.n) + ((tb1.t7 * tb1.n) + ((tb1.t6 * tb1.n) + ((tb1.t5 * tb1.n) + ((tb1.t4 * tb1.n) + ((tb1.t3 * tb1.n) + ((tb1.t2 * tb1.n) + ((tb1.t1 * tb1.n) + (tb1.t0 * tb1.n) / tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)%tb1.b, ((tb1.t15 * tb1.n) + ((tb1.t14 * tb1.n) + ((tb1.t13 * tb1.n) + ((tb1.t12 * tb1.n) + ((tb1.t11 * tb1.n) + ((tb1.t10 * tb1.n) + ((tb1.t9 * tb1.n) + ((tb1.t8 * tb1.n) + ((tb1.t7 * tb1.n) + ((tb1.t6 * tb1.n) + ((tb1.t5 * tb1.n) + ((tb1.t4 * tb1.n) + ((tb1.t3 * tb1.n) + ((tb1.t2 * tb1.n) + ((tb1.t1 * tb1.n) + (tb1.t0 * tb1.n) / tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)%tb1.b, ((tb1.t14 * tb1.n) + ((tb1.t13 * tb1.n) + ((tb1.t12 * tb1.n) + ((tb1.t11 * tb1.n) + ((tb1.t10 * tb1.n) + ((tb1.t9 * tb1.n) + ((tb1.t8 * tb1.n) + ((tb1.t7 * tb1.n) + ((tb1.t6 * tb1.n) + ((tb1.t5 * tb1.n) + ((tb1.t4 * tb1.n) + ((tb1.t3 * tb1.n) + ((tb1.t2 * tb1.n) + ((tb1.t1 * tb1.n) + (tb1.t0 * tb1.n) / tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)%tb1.b, ((tb1.t13 * tb1.n) + ((tb1.t12 * tb1.n) + ((tb1.t11 * tb1.n) + ((tb1.t10 * tb1.n) + ((tb1.t9 * tb1.n) + ((tb1.t8 * tb1.n) + ((tb1.t7 * tb1.n) + ((tb1.t6 * tb1.n) + ((tb1.t5 * tb1.n) + ((tb1.t4 * tb1.n) + ((tb1.t3 * tb1.n) + ((tb1.t2 * tb1.n) + ((tb1.t1 * tb1.n) + (tb1.t0 * tb1.n) / tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)%tb1.b, ((tb1.t12 * tb1.n) + ((tb1.t11 * tb1.n) + ((tb1.t10 * tb1.n) + ((tb1.t9 * tb1.n) + ((tb1.t8 * tb1.n) + ((tb1.t7 * tb1.n) + ((tb1.t6 * tb1.n) + ((tb1.t5 * tb1.n) + ((tb1.t4 * tb1.n) + ((tb1.t3 * tb1.n) + ((tb1.t2 * tb1.n) + ((tb1.t1 * tb1.n) + (tb1.t0 * tb1.n) / tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)%tb1.b, ((tb1.t11 * tb1.n) + ((tb1.t10 * tb1.n) + ((tb1.t9 * tb1.n) + ((tb1.t8 * tb1.n) + ((tb1.t7 * tb1.n) + ((tb1.t6 * tb1.n) + ((tb1.t5 * tb1.n) + ((tb1.t4 * tb1.n) + ((tb1.t3 * tb1.n) + ((tb1.t2 * tb1.n) + ((tb1.t1 * tb1.n) + (tb1.t0 * tb1.n) / tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)%tb1.b, ((tb1.t10 * tb1.n) + ((tb1.t9 * tb1.n) + ((tb1.t8 * tb1.n) + ((tb1.t7 * tb1.n) + ((tb1.t6 * tb1.n) + ((tb1.t5 * tb1.n) + ((tb1.t4 * tb1.n) + ((tb1.t3 * tb1.n) + ((tb1.t2 * tb1.n) + ((tb1.t1 * tb1.n) + (tb1.t0 * tb1.n) / tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)%tb1.b, ((tb1.t9 * tb1.n) + ((tb1.t8 * tb1.n) + ((tb1.t7 * tb1.n) + ((tb1.t6 * tb1.n) + ((tb1.t5 * tb1.n) + ((tb1.t4 * tb1.n) + ((tb1.t3 * tb1.n) + ((tb1.t2 * tb1.n) + ((tb1.t1 * tb1.n) + (tb1.t0 * tb1.n) / tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)%tb1.b, ((tb1.t8 * tb1.n) + ((tb1.t7 * tb1.n) + ((tb1.t6 * tb1.n) + ((tb1.t5 * tb1.n) + ((tb1.t4 * tb1.n) + ((tb1.t3 * tb1.n) + ((tb1.t2 * tb1.n) + ((tb1.t1 * tb1.n) + (tb1.t0 * tb1.n) / tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)%tb1.b, ((tb1.t7 * tb1.n) + ((tb1.t6 * tb1.n) + ((tb1.t5 * tb1.n) + ((tb1.t4 * tb1.n) + ((tb1.t3 * tb1.n) + ((tb1.t2 * tb1.n) + ((tb1.t1 * tb1.n) + (tb1.t0 * tb1.n) / tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)%tb1.b, ((tb1.t6 * tb1.n) + ((tb1.t5 * tb1.n) + ((tb1.t4 * tb1.n) + ((tb1.t3 * tb1.n) + ((tb1.t2 * tb1.n) + ((tb1.t1 * tb1.n) + (tb1.t0 * tb1.n) / tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)%tb1.b, ((tb1.t5 * tb1.n) + ((tb1.t4 * tb1.n) + ((tb1.t3 * tb1.n) + ((tb1.t2 * tb1.n) + ((tb1.t1 * tb1.n) + (tb1.t0 * tb1.n) / tb1.b)/tb1.b)/tb1.b)/tb1.b)/tb1.b)%tb1.b, ((tb1.t4 * tb1.n) + ((tb1.t3 * tb1.n) + ((tb1.t2 * tb1.n) + ((tb1.t1 * tb1.n) + (tb1.t0 * tb1.n) / tb1.b)/tb1.b)/tb1.b)/tb1.b)%tb1.b, ((tb1.t3 * tb1.n) + ((tb1.t2 * tb1.n) + ((tb1.t1 * tb1.n) + (tb1.t0 * tb1.n) / tb1.b)/tb1.b)/tb1.b)%tb1.b, ((tb1.t2 * tb1.n) + ((tb1.t1 * tb1.n) + (tb1.t0 * tb1.n) / tb1.b)/tb1.b)%tb1.b, ((tb1.t1 * tb1.n) + (tb1.t0 * tb1.n) / tb1.b)%tb1.b, (tb1.t0 * tb1.n) % tb1.b from tb1 where tb1.n < 89 ) , t2 as ( select tb1.n - 1 as N, FORMAT(tb1.t18, '0000000') + FORMAT(tb1.t17, '0000000') + FORMAT(tb1.t16, '0000000') + FORMAT(tb1.t15, '0000000') + FORMAT(tb1.t14, '0000000') + FORMAT(tb1.t13, '0000000') + FORMAT(tb1.t12, '0000000') + FORMAT(tb1.t11, '0000000') + FORMAT(tb1.t10, '0000000') + FORMAT(tb1.t9, '0000000') + FORMAT(tb1.t8, '0000000') + FORMAT(tb1.t7, '0000000') + FORMAT(tb1.t6, '0000000') + FORMAT(tb1.t5, '0000000') + FORMAT(tb1.t4, '0000000') + FORMAT(tb1.t3, '0000000') + FORMAT(tb1.t2, '0000000') + FORMAT(tb1.t1, '0000000') + FORMAT(tb1.t0, '0000000') as FACT from tb1 ) select t2.N, SUBSTRING(t2.FACT, PATINDEX('%[^0]%', t2.FACT+'.'), LEN(t2.FACT)) from t2 order by t2.N
from https://stackoverflow.com/questions/3504932/sql-functions-factorial by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL0418N 오류 해결 방법 (0) | 2020.05.16 |
---|---|
[SQL] 동적 파일 이름으로 복사 (0) | 2020.05.16 |
[SQL] SQLSTATE는 [42S22] : 열을 찾을 수 없습니다 : 1054 알 수없는 열 - Laravel (0) | 2020.05.16 |
[SQL] 빈 SQL 테이블 퍼키이 있습니까? 모든 SQL 테이블합니까? (0) | 2020.05.16 |
[SQL] SELECT 목록에서 별칭 다른 곳에서 참조 (0) | 2020.05.16 |