sql >> Database >  >> RDS >> PostgreSQL

Dubbele opeenvolgende records filteren in een SELECT

Nou, je bent niet zo dichtbij omdat row_number() kan geen sequenties van twee groepen tegelijk volgen. PARTITION BY tm_nl_fixedid ORDER BY date RESTART ON GAP bestaat niet, zoiets bestaat niet.

Itzik Ben-Gan heeft een oplossing voor het probleem met eilanden en gaten waarmee u wordt geconfronteerd (meerdere oplossingen eigenlijk). Het idee is om rijen te ordenen op basis van de belangrijkste criteria (datum) en vervolgens op indelingscriteria + hoofdcriteria. Het verschil tussen de rangtelwoorden blijft hetzelfde omdat ze tot dezelfde indelingscriteria en datumreeksen behoren.

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

Hier is Sql Fiddle met voorbeeld .

En hier is hoofdstuk 5 van Sql Server MVP Deep Dives met verschillende oplossingen voor het probleem met eilanden en gaten .



  1. Android automatisch vernieuwen wanneer nieuwe gegevens in lijstweergave worden ingevoegd

  2. MySQL krijgt een geordende lijst met contacten op het laatst verzonden/ontvangen bericht

  3. 5 redenen om voor Arkware te kiezen

  4. CakePHP:instellen van ACL toestaan/weigeren werkt niet (tabellen worden niet bijgewerkt)?