sql >> Database teknologi >  >> RDS >> Sqlserver

Valg af et undersæt af rækker, der overstiger en procentdel af de samlede værdier

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; 

LiveDemo

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; 

LiveDemo2

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;  

LiveDemo3

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; 

LiveDemo4



  1. hvordan man bruger COALESCE i oracle til at kombinere data fra to rækker

  2. Multi-tenant PHP SaaS - Separate DB'er for hver klient, eller gruppere dem?

  3. Jhipster 5.7.2 Sådan migreres til mysql fra H2 ved at beholde mine ændringer

  4. Forskellen i håndteringen af ​​mellemrummene mellem Oracle og SQL Server