SAK �}�‘ŠÙ
SQL –â‚¢�‡‚킹 - •ª�̓tƒ@ƒ“ƒNƒVƒ‡ƒ“�Aover�Apartition by�Arange�Adense_rank
•ª�̓tƒ@ƒ“ƒNƒVƒ‡ƒ“‚ÌŽg‚¢•û‚ª—Ç‚•ª‚©‚ç‚È‚¢‚Ì‚ÅŽŽ‚µ‚Ă݂½�B
‚Ù‚Æ‚ñ‚Ç‚Ì�WŒvŠÖ�”‚ª•ª�ÍŠÖ�”‚Æ‚µ‚ÄŽg‚¦‚é‚Ý‚½‚¢‚Å‚ ‚é�B
‚±‚ê‚Í Oracle8i ‚©‚ç‚ ‚Á‚½‹@”\‚È‚ñ‚¾‚낤‚©�B
�¡PARTITION BY
�EƒOƒ‹�[ƒv�WŒvŠî–{Œ^�B
select •i”Ô, count(*), sum(Žó’��”), avg(Žó’��”) from Žó’�m group by •i”Ô;
•i”Ô COUNT(*) SUM(Žó’��”) AVG(Žó’��”)
------------------ ---------- ----------- -----------
a001 25 10562 422.48
b001 7 16797 2399.57143
c001 3 6010 2003.33333
�E‘��WŒvŠî–{Œ^�B
select count(*), sum(Žó’��”), avg(Žó’��”) from Žó’�m;
COUNT(*) SUM(Žó’��”) AVG(Žó’��”)
---------- ----------- -----------
35 33369 953.4
�E•i”Ô’PˆÊ‚Ì•½‹ÏŽó’��”‚ð–¾�ׂɒljÁ�B
partition by ‚Í�AƒOƒ‹�[ƒv‰»•ªŠ„‚·‚é�B
select Žó’�”Ô�†, •i”Ô, Žó’��”,
avg(Žó’��”) over (partition by •i”Ô order by •i”Ô) aŽó’��”
from Žó’�m order by •i”Ô, Žó’�”Ô�†
;
Žó’�”Ô�† •i”Ô Žó’��” AŽó’��”
---------- ------------------ ---------- ----------
000001-001 a001 70 422.48
000001-002 a001 500 422.48
000001-056 a001 500 422.48
...
�Epartition by ‚ª‚È‚¢‚Æ‘��WŒv‚ɂȂé�B
select Žó’�”Ô�†, •i”Ô, Žó’��”,
avg(Žó’��”) over () aŽó’��”
from Žó’�m order by •i”Ô, Žó’�”Ô�†
;
Žó’�”Ô�† •i”Ô Žó’��” AŽó’��”
---------- ------------------ ---------- ----------
000001-001 a001 70 953.4
000001-002 a001 500 953.4
000001-056 a001 500 953.4
...
�¡RANGE�ABETWEEN
�E•i”Ô’PˆÊ‚ÌŒ��”‚ð–¾�ׂɒljÁ�B
partition by ‚Í�AƒOƒ‹�[ƒv‰»•ªŠ„‚·‚é�B
select Žó’�”Ô�†, •i”Ô, Žó’��”,
count(*) over (partition by •i”Ô order by •i”Ô) ct
from Žó’�m order by •i”Ô, Žó’�”Ô�†
;
Žó’�”Ô�† •i”Ô Žó’��” CT
---------- ------------------ ---------- ----------
000001-001 a001 70 25
000001-002 a001 500 25
000001-056 a001 500 25
...
�EŽó’��”‚æ‚è -1000 �` +4500 ‚Ì•i”Ô–ˆ‚ÌŒ��”‚ð–¾�ׂɒljÁ�B
select Žó’�”Ô�†, •i”Ô, Žó’��”,
count(*) over (partition by •i”Ô order by Žó’��”
range between 1000 preceding and 4500 following) ct
from Žó’�m order by •i”Ô, Žó’�”Ô�†
;
Žó’�”Ô�† •i”Ô Žó’��” CT
---------- ------------------ ---------- ----------
000001-061 c001 1500 2
000921-001 c001 10 3
100011-002 c001 4500 1
...
�¡DENSE_RANK�ARANK
�EŽó’��”‚Ì‘½‚¢�‡‚Ƀ‰ƒ“ƒN‚ð•t‚¯‚é�B
select Žó’�”Ô�†, •i”Ô, Žó’��”,
dense_rank() over (order by Žó’��” desc) rank
from Žó’�m order by rank, •i”Ô, Žó’�”Ô�†
;
Žó’�”Ô�† •i”Ô Žó’��” RANK
---------- ------------------ ---------- ----------
000011-001 b001 6000 1
000019-001 b001 5555 2
100011-002 c001 4500 3
...
�Erank ‚Í“¯‚¶ƒ‰ƒ“ƒN‚ª‚ ‚邯ƒ‰ƒ“ƒN’l‚ª”ò‚Ô�B
select Žó’�”Ô�†, •i”Ô, Žó’��”,
rank() over (order by Žó’��” desc) rank
from Žó’�m order by rank, •i”Ô, Žó’�”Ô�†
;
Žó’�”Ô�† •i”Ô Žó’��” RANK
---------- ------------------ ---------- ----------
000011-001 b001 6000 1
000019-001 b001 5555 2
100011-002 c001 4500 3
...
�E—á‚͈«‚¢‚ª�AŽd“ü�æCD ‚Ì�Å�‰‚̃‰ƒ“ƒN‚ɑ΂·‚é�Å�¬Žó’��”‚Æ
Žd“ü�æCD ‚Ì�ÅŒã‚̃‰ƒ“ƒN‚ɑ΂·‚é�Å‘åŽó’��”‚ð‹�‚ß‚é�B
select •i”Ô,
min(Žó’��”) keep (dense_rank first order by “¾ˆÓ�æCD) min,
max(Žó’��”) keep (dense_rank last order by “¾ˆÓ�æCD) max
from Žó’�m group by •i”Ô
;
•i”Ô MIN MAX
------------------ ---------- ----------
a001 10 4000
b001 2000 6000
c001 10 1500
...
�E“¯‚¶‚–¾�׃Œƒxƒ‹‚Å�s‚¤�B
select Žó’�”Ô�†, •i”Ô,
min(Žó’��”) keep (dense_rank first order by “¾ˆÓ�æCD)
over(partition by •i”Ô) min,
max(Žó’��”) keep (dense_rank last order by “¾ˆÓ�æCD)
over(partition by •i”Ô) max
from Žó’�m order by •i”Ô
;
Žó’�”Ô�† •i”Ô MIN MAX
---------- ------------------ ---------- ----------
000001-002 a001 10 4000
000001-001 a001 10 4000
000001-056 a001 10 4000
...
�¡SQL Šî‘bŽÀ’n•ÒŽ‘—¿
�¡SQL Šî‘b•ÒŽ‘—¿
�¡SQL ƒ`ƒ…�[ƒjƒ“ƒO•ÒŽ‘—¿
�¡Oracle PL/SQL •ÒŽ‘—¿
�¡PostgreSQL •Ò�AJAVA Servlet�AJSP •ÒŽ‘—¿
�¡MySQL •ÒŽ‘—¿