programing

SQL의 곱셈 집계 연산자

megabox 2023. 3. 5. 09:42
반응형

SQL의 곱셈 집계 연산자

SQL에는 AVG, SUM, COUNT와 같은 집계 연산자가 있는데 왜 곱셈 연산자가 없는 걸까요?'MUL'인가 뭔가.

Oracle, MSSQL, MySQL에 이 기능이 있는지 궁금했습니다.그렇지 않은 경우 이 동작을 일으킬 수 있는 회피책이 있습니까?

MUL이란 가치의 점진적 곱셈을 말하는 건가요?

크기가 작은 행(예: 10s)이 100개라도 MUL(열)은 모든 데이터 유형에 걸쳐 오버플로우됩니다.오사용/남용 가능성이 높고 사용범위가 매우 제한적이므로 SQL Standard일 필요는 없습니다.다른 사람들이 보여주듯이 SQL에서 표준(및 일반적인 사용) 방법을 사용하여 까다로운 계산을 수행하는 방법은 여러 가지가 있는 것처럼 수학적인 방법이 있습니다.

샘플 데이터:

Column
1
2
4
8

COUNT : 4 items (1 for each non-null)
SUM   : 1 + 2 + 4 + 8 = 15
AVG   : 3.75 (SUM/COUNT)
MUL   : 1 x 2 x 4 x 8 ? ( =64 )

완전성을 위해 Oracle, MS SQL, MySQL 코어 구현*

Oracle : EXP(SUM(LN(column)))   or  POWER(N,SUM(LOG(column, N)))
MSSQL  : EXP(SUM(LOG(column)))  or  POWER(N,SUM(LOG(column)/LOG(N)))
MySQL  : EXP(SUM(LOG(column)))  or  POW(N,SUM(LOG(N,column)))
  • SQL Server에서 EXP/LOG를 사용할 때 주의하여 반환 유형 http://msdn.microsoft.com/en-us/library/ms187592.aspx을 확인하십시오.
  • POWER 형식은 큰 수(Oiler 수보다 큰 수 사용)를 허용하며, 결과가 너무 커서 POWER를 사용하여 되돌릴 수 없는 경우에는 로그 값만 반환하고 SQL 쿼리 외부에서 실제 수를 계산할 수 있습니다.


* LOG(0) and LOG(-ve) are undefined. The below shows only how to handle this in SQL Server. Equivalents can be found for the other SQL flavours, using the same concept

create table MUL(data int)
insert MUL select 1 yourColumn union all
           select 2 union all
           select 4 union all
           select 8 union all
           select -2 union all
           select 0

select CASE WHEN MIN(abs(data)) = 0 then 0 ELSE
       EXP(SUM(Log(abs(nullif(data,0))))) -- the base mathematics
     * round(0.5-count(nullif(sign(sign(data)+0.5),1))%2,0) -- pairs up negatives
       END
from MUL

구성 요소:

  • 데이터의 abs()를 취하면, 최소값이 0일 경우, 다른 부질없는 것을 곱하면 결과는 0이 됩니다.
  • 데이터가 0일 경우 NULLIF는 데이터를 NULL로 변환합니다.abs(), log() 모두 null을 반환하여 sum()에서 제외됩니다.
  • 데이터가 0이 아닌 경우, 복근에서는 LOG 방법을 사용하여 음수를 여러 개 사용할 수 있습니다. 다른 곳에서 음수를 추적합니다.
  • 마지막 사인 작성 중
    • 부호(데이터) 반환1 for >0,0 for 0그리고.-1 for <0.
    • 0.5를 더하고 sign()을 다시 사용하므로 0과 1을 모두 1로 분류하고 -1만 -1로 분류했습니다.
    • 다시 NULLIF를 사용하여 COUNT() the 1을 삭제합니다.음수만 세면 되기 때문입니다.
    • % 2음수 count()에 대해 다음 중 하나를 반환합니다.
    • --> 1(홀수 수의 음수가 있는 경우)
    • --> 음수가 짝수일 경우 0
    • 더 수학적인 트릭: 우리는 0.5에서 1 또는 0을 빼서, 위의 것을
    • (-->) (0.5-1=-0.5=> 홀수 음수일 경우 -1)로 반올림
    • (-->) (0.5-0= 0.5=> 반올림 1) 짝수일 경우
    • 이 최종 1/1을 SUM-PRODUCT 값과 비교하여 실제 결과를 구한다.

아니요, 하지만 수학을 사용할 수 있습니다. : )

yourColumn0으로 하다

select EXP(SUM(LOG(yourColumn))) As ColumnProduct from yourTable

Oracle의 답변이 아직 누락되어 있습니다.다음은 예를 제시하겠습니다.

SQL> with yourTable as
  2  ( select 1 yourColumn from dual union all
  3    select 2 from dual union all
  4    select 4 from dual union all
  5    select 8 from dual
  6  )
  7  select EXP(SUM(LN(yourColumn))) As ColumnProduct from yourTable
  8  /

COLUMNPRODUCT
-------------
           64

1 row selected.

★★★★★★★★★★★★★★★★,

Postgre 포함SQL은 자체 집계 함수를 생성할 수 있습니다(http://www.postgresql.org/docs/8.2/interactive/sql-createaggregate.html 참조).

MySQL에서 집계 함수를 만들려면 .so(리눅스) 또는 .dll(윈도우즈) 파일을 작성해야 합니다.예를 다음에 나타냅니다.http://www.codeproject.com/KB/database/mygroupconcat.aspx

mssql과 oracle은 확실하지 않지만 커스텀 애그리게이트를 작성하는 옵션도 있을 것입니다.

숫자가 증가함에 따라 데이터 유형을 매우 빠르게 분류할 수 있습니다.

LOG/EXP 사용은 LOG 사용 시 실패할 숫자 <= 0 때문에 까다롭다.나는 이 문제를 다루는 해결책을 이 질문에 썼다.

MS SQL에서의 CTE 사용:

CREATE TABLE Foo(Id int, Val int)
INSERT INTO Foo VALUES(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)

;WITH cte AS 
(
    SELECT Id, Val AS Multiply, row_number() over (order by Id) as rn
    FROM Foo
    WHERE Id=1
    UNION ALL
    SELECT ff.Id, cte.multiply*ff.Val as multiply, ff.rn FROM
    (SELECT f.Id, f.Val, (row_number() over (order by f.Id)) as rn
    FROM Foo f) ff
        INNER JOIN cte
        ON ff.rn -1= cte.rn
)
SELECT * FROM cte

또는 "sql-server" "MySQL"만 할 수 .*평소처럼 말이야

mysql> select count(id), count(id)*10 from tablename;
+-----------+--------------+
| count(id) | count(id)*10 |
+-----------+--------------+
|       961 |         9610 |
+-----------+--------------+
1 row in set (0.00 sec)

언급URL : https://stackoverflow.com/questions/5416169/multiplication-aggregate-operator-in-sql

반응형