PostgreSQL和顺序数据

mon*_*ksy 5 sql database postgresql

我有一个包含以下内容的数据集:

Table { date itemName }
Run Code Online (Sandbox Code Playgroud)

大部分日期是顺序的.日期没有重复[因为它是主键].

问题分为多个部分(所有部分都与使用SQL有关):

  1. 是否有可能在表格中列出的日期系列中找到差距?例如:1/2/09-1/3/09缺少日期
  2. 是否有可能找到表中缺少的日期部分,其范围大于n(这是在运行时确定的数字)?例如:对于n = 2日期1/2/09-1/3/09不返回但是日期5/6/09-6/1/09是.

Ant*_*sma 10

如果你可以使用PostgreSQL 8.4,那么窗口函数将有助于:

SELECT *
    FROM (SELECT itemName, date, date - lag(date) OVER w AS gap
              FROM someTable WINDOW w AS (ORDER BY date)
         ) AS pairs
    WHERE pairs.gap > '1 day'::interval;
Run Code Online (Sandbox Code Playgroud)


Tom*_*zky 1

只需在 plsql 或客户端中创建一个函数来检查所有日期。就像这个伪代码:

date checked_date = 2000-01-01;
int unchecked_section = 0;
while ( checked_date <= today() ) {
  if (! sql(select itemName from Table where itemName=checked_date)) {
    unchecked_section++;
  } else {
    if ( unchecked_section>=n ) {
      print checked_date-unchecked_section, checked_date
    }
    unchecked_section = 0;
  }
  checked_date++;
}
if ( unchecked_section ) {
  print checked_date-unchecked_section, checked_date
}
Run Code Online (Sandbox Code Playgroud)

它不必非常快,因为它只是维护。可供检查的日期并不多——一年只有 365 个。