sql >> データベース >  >> RDS >> PostgreSQL

SELECTで重複する後続のレコードを除外する

    row_number()なので、それほど近くにはありません。 2つのグループによるシーケンスを同時に追跡することはできません。 PARTITION BY tm_nl_fixedid ORDER BY date RESTART ON GAP 存在しない、そのようなものはありません。

    Itzik Ben-Ganには、直面している島とギャップの問題に対する解決策があります(実際にはいくつかの解決策があります)。アイデアは、主な基準(日付)で行を並べ替えてから、基準と主な基準を分割することです。序数の違いは、同じ分割基準と日付系列に属しているため、同じままです。

    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フィドルがあります

    これは、SQL Server MVPディープダイブの第5章で、島とギャップの問題に対するいくつかの解決策があります



    1. MySQLでselectから削除するにはどうすればよいですか?

    2. これは正確に何をしますかClass.forName(com.mysql.jdbc.Driver).newInstance();

    3. 多対多のSQLからの削除-AlchemyとPostgresql

    4. MySQL各一意の値の最初の出現時に行を選択します