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

Как да добавите текущ брой към редове в „поредица“ от последователни дни

Надграждане върху тази таблица (без използване на SQL ключовата дума „дата“ като име на колона.):

CREATE TABLE tbl(
  pid int
, the_date date
, PRIMARY KEY (pid, the_date)
);

Заявка:

SELECT pid, the_date
     , row_number() OVER (PARTITION BY pid, grp ORDER BY the_date) AS in_streak
FROM  (
   SELECT *
        , the_date - '2000-01-01'::date
        - row_number() OVER (PARTITION BY pid ORDER BY the_date) AS grp
   FROM   tbl
) sub
ORDER  BY pid, the_date;

Изваждане на date от друга date дава integer . Тъй като търсите последователни дни, всеки следващ ред ще бъде по-голям с един . Ако извадим row_number() от това цялата поредица завършва в една и съща група (grp ) за pid . Тогава е лесно да раздадете брой на група.

grp се изчислява с две изваждания, които трябва да са най-бързи. Също толкова бърза алтернатива може да бъде:

the_date - row_number() OVER (PARTITION BY pid ORDER BY the_date) * interval '1d' AS grp

Едно умножение, едно изваждане. Конкатенацията и прехвърлянето на низове е по-скъпо. Тествайте с EXPLAIN ANALYZE .

Не забравяйте да разделите по pid допълнително в и двете стъпки, или по невнимание ще смесите групи, които трябва да бъдат разделени.

Използване на подзаявка, тъй като това обикновено е по-бързо от CTE . Тук няма нищо, което обикновена подзаявка да не може да направи.

И тъй като го споменахте:dense_rank() очевидно не необходимо тук. Основен row_number() върши работата.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да създадете еквивалент на колона за идентичност на SQL Server в Postgres

  2. Как да задам часова зона на postgresql jdbc връзка, създадена от flyway?

  3. Rails (postgres) заявка с jsonb масив

  4. Как да инсталирате MADlib apt?

  5. Защо получавам ActionView::Template::Error:undefined method `name' for nil:NilClass на Heroku, но не локално