PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Odfiltrowywanie zduplikowanych kolejnych rekordów w SELECT

Cóż, nie jesteś tak blisko, ponieważ row_number() nie można jednocześnie śledzić sekwencji dwóch grup. PARTITION BY tm_nl_fixedid ORDER BY date RESTART ON GAP nie istnieje, nie ma czegoś takiego.

Itzik Ben-Gan ma rozwiązanie problemu wysp i luk, z którymi się borykasz (właściwie kilka rozwiązań). Chodzi o to, aby uporządkować wiersze według kryteriów głównych (data), a następnie według kryteriów partycjonowania + kryteriów głównych. Różnica między liczbami porządkowymi pozostanie taka sama, ponieważ należą one do tych samych kryteriów podziału i serii dat.

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

Oto Sql Fiddle z przykładem .

A oto rozdział 5 głębokiego nurkowania Sql Server MVP z kilkoma rozwiązaniami problemu wysp i luk .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Relacja błędu nie istnieje

  2. Uzyskaj identyfikator z warunkowego INSERT

  3. Wykonaj aktualizację alembika w wielu schematach

  4. pg-promise:użyj wyniku jednego zapytania w następnym zapytaniu w ramach transakcji

  5. SQL kontynuuje wykonywanie zapytań po naruszeniu zduplikowanego klucza