PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Филтриране на дублирани последващи записи в SELECT

Е, не сте толкова близо, защото row_number() не може да проследява последователности от две групи едновременно. PARTITION BY tm_nl_fixedid ORDER BY date RESTART ON GAP не съществува, няма такова нещо.

Ицик Бен-Ган има решение за проблема с островите и пропуските, с които се сблъсквате (всъщност няколко решения). Идеята е да се подредят редове по основните критерии (дата) и след това по критерии за разделяне + основни критерии. Разликата между ординалите ще остане същата, тъй като принадлежат към едни и същи критерии за разделяне и серии от дати.

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

Ето Sql Fiddle с пример .

А ето и глава 5 от Sql Server MVP Deep Dives с няколко решения на проблема с островите и празнините .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Наличие на обща колона GEOGRAPHY с PostGIS

  2. Извикване на функция за връщане на набор с аргумент на масив няколко пъти

  3. Обемът на Docker не запазва данни

  4. Обяснена команда за PostgreSQL VALUES

  5. Подобрения в разделянето в PostgreSQL 11