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 값과 비교하여 실제 결과를 구한다.
- 부호(데이터) 반환
아니요, 하지만 수학을 사용할 수 있습니다. : )
yourColumn
0으로 하다
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
'programing' 카테고리의 다른 글
블로그 폴더 외부에 있는 index.php 콘텐츠를 로드하여 한 페이지를 게시합니다. (0) | 2023.03.10 |
---|---|
WooCommerce 감사 페이지 확인하는 방법 (0) | 2023.03.05 |
WordPress에서 "508 Resource Limit is reached" 오류를 수정하는 방법 (0) | 2023.03.05 |
기존 SQL 데이터베이스 위에 탄력 검색을 사용하는 방법 (0) | 2023.03.05 |
jq에 bash 변수 전달 중 (0) | 2023.03.05 |