SQL Server 2012+
kun
Du kan bruge vinduet SUM
:
MED cte AS( SELECT *, 1,0 * Omsætning/SUM(Omsætning) OVER(OPDELING AF [Bruger]) SOM percentil, 1,0 * SUM(Indtægt) OVER(OPDELING EFTER [Bruger] ORDRE EFTER [Omsætning] DESC) /SUM(Omsætning) OVER(OPDELING AF [Bruger]) AS running_percentile FRA fanen)SELECT *FROM cte WHERE running_percentile <=0,8;
SQL Server 2008:
MED cte AS( SELECT *, ROW_NUMBER() OVER(OPDELING AF [BRUGER] ORDER BY Revenue DESC) AS rn FROM t ), cte2 AS( SELECT c.Customer, c.[Bruger], ca. [Omsætning] ,percentil =1,0 * Omsætning / NULLIF(c3.s,0) ,løbende_percentil =1,0 * c2.s / NULLIF(c3.s,0) FRA cte c CROSS APPLY (VÆLG SUM(Omsætning) AS s FROM cte c2 HVOR c.[Bruger] =c2.[Bruger] OG c2.rn <=c.rn) c2 KRYDS ANVEND (VÆLG SUM(Omsætning) SOM s FRA cte c2 HVOR c.[Bruger] =c2.[Bruger]) AS c3) VÆLG *FROM cte2WHERE running_percentile <=0,8;
Output:
╔══════════╦═══════╦════════════╦═══════╦═══════════════════════════ ══╦════════════════════╗║ Kunde ║ Bruger ║ Indtægter ║ Percentil ║ Running_percentile ║╠══════════╬═══ ════╬═════════╬════════════════╬══════════════════ ══╣║ 2 ║ James ║ 750 ║ 0,384615384615 ║ 0,384615384615 ║║ 1 ║ James ║ 500 ║ 0,256410256410 ║ 0,641025641025 ║║ 7 ║ Sarah ║ 600 ║ 0,444444444444 ║ 0,444444444444 ║╚═ ═════════╩═══════╩═════════╩════════════════╩═════ ═══════════════╝
EDIT 2:
MED cte AS( SELECT *, ROW_NUMBER() OVER(OPDELING AF [BRUGER] ORDER BY Revenue DESC) AS rn FROM t ), cte2 AS( SELECT c.Customer, c.[Bruger], ca. [Omsætning] ,percentil =1,0 * Omsætning / NULLIF(c3.s,0) ,løbende_percentil =1,0 * c2.s / NULLIF(c3.s,0) FRA cte c CROSS APPLY (VÆLG SUM(Omsætning) AS s FROM cte c2 HVOR c.[Bruger] =c2.[Bruger] OG c2.rn <=c.rn) c2 KRYDS ANVEND (VÆLG SUM(Omsætning) SOM s FRA cte c2 HVOR c.[Bruger] =c2.[Bruger]) AS c3) SELECT a.*FROM cte2 aCROSS APPLY (SELECT MIN(running_percentile) AS rp FROM cte2 WHERE running_percentile>=0.8 AND cte2.[User] =a.[User]) AS sWHERE a.running_percentile <=s.rp;
Output:
╔══════════╦═══════╦════════════╦═══════╦═══════════════════════════ ══╦════════════════════╗║ Kunde ║ Bruger ║ Indtægter ║ Percentil ║ Running_percentile ║╠══════════╬═══ ════╬═════════╬════════════════╬══════════════════ ══╣║ 2 ║ James ║ 750 ║ 0,384615384615 ║ 0,384615384615 ║║ 1 ║ JAMES ║ 500 ║ 0,256410256410 ║ 0,641025641025 ║║ 3 ║ JAMES ║ 450 ║ 0,2307692307699 ║ 0,871794 ║║ ║ ║ 450 ║ 0,23076992307699 ║ 0,871794 ║║ ║ ║ 450 ║ 0,23076992307699 ║ 0,871794 ║║ 450 ║ 0,2307769237699 ║ 0,87179487171717171 71717171 7171 7171 7171 ║ Sarah ║ 600 ║ 0,444444444444 ║ 0,444444444444 ║║ 5 ║ Sarah ║ 500 ║ 0,370370370370 ║ 0,814814814814 ║╚══════════╩═══════╩══ Kode
SQL Server 2008
understøtter ikke alt i OVER()
klausul, men ROW_NUMBER
gør.
Først skal du bare beregne position inden for en gruppe:
╔═══════════╦════════╦═══════════╦════════╦═══════════╦════════╦═══════════════════════ ║ rn ║╠═══════════╬════════╬══════════╬════╣║ 2 ║ James ║ 750 ║ 1 ║ ║ 1 ║ James ║ 500 ║ 2 ║║ 3 ║ James ║ 450 ║ 3 ║║ 8 ║ James ║ 150 ║ 4 ║║ 9 ║ James ║ 100 ║ 5 ║║ 7 ║ Sarah ║ 600 ║ 1 ║║ 5 ║ Sarah ║ 500 ║ 2 ║║ 6 ║ Sarah ║ 150 ║ 3 ║║ 4 ║ Sarah ║ 100 ║ 4 ║╚═══════════╩════════╩══════ ════╩════╝
Anden cte:
c2
underforespørgsel beregne løbende total baseret på rangering fra ROW_NUMBER
c3
beregn fuld sum pr. bruger
I den sidste forespørgsel s
underforespørgsel finder den laveste kørende
samlet, der overstiger 80 %.
EDIT 3:
Bruger ROW_NUMBER
er faktisk overflødig.
WITH cte AS( SELECT c.Customer, c.[Bruger], c.[Omsætning] ,percentil =1,0 * Omsætning / NULLIF(c3.s,0) ,running_percentile =1.0 * c2.s / NULLIF(c3.s,0) FRA t c CROSS APPLY (SELECT SUM(Revenue) AS s FROM t c2 WHERE c.[Bruger] =c2.[Bruger] OG c2.Indtægt>=c.Indtægt) c2 CROSS APPLY (VÆLG) SUM(Omsætning) SOM s FRA t c2 HVOR c.[Bruger] =c2.[Bruger]) SOM c3) VÆLG a.*FRA cte aCROSS ANVEND (VÆLG MIN(løbende_percentil) SOM rp FRA cte c2 HVOR løbepercentil>=0,8 OG c2.[Bruger] =a.[Bruger]) AS sWHERE a.running_percentile <=s.rpORDER BY [User], Revenue DESC;