복붙노트

[SQL] SQL 함수 - 계승

SQL

SQL 함수 - 계승

나는 SQL 함수에서 초보자입니다. 어떤 것은 SQL 서버 - 말 (10)에 계승하는 기능을 만들 수있는 가장 좋은 방법입니다!

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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 
    
  13. from https://stackoverflow.com/questions/3504932/sql-functions-factorial by cc-by-sa and MIT license