sql >> Databáze >  >> RDS >> PostgreSQL

Odfiltrování duplicitních následných záznamů v SELECT

No, nejste tak blízko, protože row_number() nelze sledovat sekvence dvou skupin současně. PARTITION BY tm_nl_fixedid ORDER BY date RESTART ON GAP neexistuje, nic takového neexistuje.

Itzik Ben-Gan má řešení pro problém ostrovů a mezer, kterým čelíte (ve skutečnosti několik řešení). Cílem je seřadit řádky podle hlavních kritérií (datum) a poté podle kritérií rozdělení + hlavních kritérií. Rozdíl mezi pořadovými číslicemi zůstane stejný, protože patří ke stejným kritériím rozdělení a datové řadě.

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

Zde je příklad Sql Fiddle .

A zde je kapitola 5 knihy Sql Server MVP Deep Dives s několika řešeními problémů s ostrovy a mezerami .



  1. RAW SQL Query s rozhraním Zend

  2. Jak naformátuji své dotazy Oracle tak, aby se sloupce nezalamovaly?

  3. Objednávejte pomocí polských písmen

  4. Jak vložit text před pole automatického přírůstku v mysql (jako:TTT00001)?