sql >> Database teknologi >  >> RDS >> PostgreSQL

Frafiltrering af duplikerede efterfølgende poster i en SELECT

Nå, du er ikke så tæt på, fordi row_number() kan ikke spore sekvenser af to grupper på samme tid. PARTITION BY tm_nl_fixedid ORDER BY date RESTART ON GAP eksisterer ikke, der er ikke sådan noget.

Itzik Ben-Gan har en løsning på problemet med øer og huller, du står over for (faktisk flere løsninger). Ideen er at sortere rækker efter hovedkriterierne (dato) og derefter opdele kriterier + hovedkriterier. Forskellen mellem ordenstal forbliver den samme, da de hører til de samme opdelingskriterier og datoserier.

with cte as
(
  select *,
      -- While order by date and order by something-else, date
      -- run along, they belong to the same sequence
         row_number() over (order by tm_date)
       - row_number() over (order by tm_nl_fixedid, tm_date) grp
    from trackingMessages
)
select *,
    -- Now we can get ordinal number grouped by each sequence
       row_number() over (partition by tm_nl_fixedid, grp
                          order by tm_date) rn
  from cte
 order by tm_date

Her er Sql Fiddle med eksempel .

Og her er kapitel 5 af Sql Server MVP Deep Dives med flere løsninger på øer og huller-problem a> .



  1. Fremmednøgle af seriel type - sørg for, at den altid udfyldes manuelt

  2. Hvad er de forskellige måder at indsætte data i SQL Server Table - SQL Server / TSQL Tutorial Part 100

  3. Sådan opdeles en streng i rækkefølge med en kommasepareret streng og (mulige) tomme felter mellem kommaer

  4. Mysql slette erklæring med grænse