sql >> Databasteknik >  >> RDS >> PostgreSQL

Filtrera bort dubbletter av efterföljande poster i en SELECT

Tja, du är inte så nära eftersom row_number() kan inte spåra sekvenser av två grupper samtidigt. PARTITION BY tm_nl_fixedid ORDER BY date RESTART ON GAP inte finns, det finns inget sådant.

Itzik Ben-Gan har en lösning för problemet med öar och luckor du står inför (flera lösningar faktiskt). Tanken är att sortera rader efter huvudkriterierna (datum) och sedan efter partitioneringskriterier + huvudkriterier. Skillnaden mellan ordningstal kommer att förbli densamma eftersom de tillhör samma partitionskriterier och datumserier.

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

Här är Sql Fiddle med exempel .

Och här är kapitel 5 av Sql Server MVP Deep Dives med flera lösningar på problem med öar och luckor .



  1. Hantera opålitliga nätverk när du skapar en HA-lösning för MySQL eller MariaDB

  2. tidsstämpel NOT NULL DEFAULT CURRENT_TIMESTAMP kan vara null på en dator men inte en annan?

  3. Använda SolarWinds Serv-U på Linux med en SQL Server Authentication Database

  4. Hur kan jag skicka sparad localStorage-webbdata till ett php-skript?