sql >> Database teknologi >  >> RDS >> Mysql

mysql - har du brug for to grænser?

Du bliver nødt til at gøre det ved at anvende en "rang" pr. distrikt, og derefter kun gribe pr. rang =1... @LastDistrict på tilslutningsstedet er som standard nul, hvis distriktet er baseret på et ID. Hvis distriktet er char-baseret, kan du bare ændre det til ="" i stedet for at matche datatypen.

For at afklare, hvad der sker. "AwardCounts"-forespørgslen udfører hele forespørgslen pr. distrikt og medlem med uanset hvor mange præmieringer der er. Derefter, sorteret efter antal af distrikts- og medlemspræmier (faldende), hvilket placerer det højeste antal præmier på den første position pr. distrikt.

Det er forbundet med et andet falsk alias "SQLVars", som blot opretter inline-variabler til forespørgslen kaldet @RankSeq og @LastDistrict. Så første gang i, vil "DistRankSeq" blive en 1 for det første distrikt, og derefter prime "@LastDistrict" med værdien af ​​distriktet. Den næste post for det samme distrikt (da den vil være i den rigtige rækkefølge) vil blive tildelt rangen 2, derefter 3 osv... Når der er en ændring fra det "SIDSTE" distrikt var til den nye rekord testet, bliver rangeringen sat tilbage til 1 og starter forfra. Så du kunne have et distrikt med 100 medlemmer, et andet med 5, et andet med 17...

Så din endelige forespørgsel har dem alle med deres respektive rækker... Anvend nu HAVE den endelige distriktsrangering =1... Hvis du gør dette, kan du også justere behovet for at få de 3 bedste medlemmer pr. distrikt (f.eks. )...

select
      AwardCounts.District,
      AwardCounts.MemberName,
      AwardCounts.memberAwards,
      @RankSeq := if( @LastDistrict = AwardCounts.District, @RankSeq +1, 1 ) DistRankSeq,
      @LastDistrict := AwardCounts.District as ignoreIt
   from
      ( select 
              a.district,
              a.membername,
              count(*) as memberAwards
           from
              Awards a
           group by
              a.district,
              a.membername
           order by
              a.district,
              memberAwards desc ) AwardCounts

      JOIN (select @RankSeq := 0, @LastDistrict = 0 ) SQLVars
   HAVING
      DistRankSeq = 1

REDIGER PR. FEEDBACK Hvis det er den sammenlægning, der tager tid, så ville jeg gøre følgende. Opret en ny tabel uden andet end aggregeringer pr. distrikt, navn og indledende rang for distriktet. Efterhånden som enhver ny post føjes til denne tabel, føjer triggeren en til det samlede tabelantal, og kontrollerer derefter, hvor denne person er i deres distrikt og opdaterer sin nye rangposition igen. Du kan tage det et skridt videre og have en anden tabel med kun "TOP"-medlem pr. distrikts-tabel, der er en pr. distrikt med personens navn. Når en ny person rammer den øverste position, sættes deres navn i tabellen, og overskriver den, der var der sidst.



  1. Java:Kaldning af en lagret procedure i en oracle-database

  2. Hvad laver en databasedesigner?

  3. Sådan deaktiveres alle CHECK &fremmednøglebegrænsninger for en tabel i SQL Server (T-SQL-eksempler)

  4. foreach %dopar% + RPostgreSQL