簡體   English   中英

PostgreSQL和順序數據

[英]PostgreSQL and Sequential Data

我有一個包含以下內容的數據集:

Table { date itemName }

大部分日期是順序的。 日期沒有重復[因為它是主鍵]。

問題分為多個部分(所有部分都與使用SQL有關):

  1. 是否有可能在表格中列出的日期系列中找到差距? 例如:缺少日期1/2/09-1/3/09
  2. 是否有可能找到表中缺少的日期部分,其范圍大於n(這是在運行時確定的數字)? 例如:對於n = 2日期不會返回1/2/09-1/3/09 5/6/09-6/1/09但是日期為5/6/09-6/1/09

如果你可以使用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;

只需在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
}

它不一定非常快,因為它只是維護。 沒有多少日期需要檢查 - 一年只有365個。

經過一些測試后,我想出了以下SQL語句:

SELECT date, itemName
  FROM "Table" as t1
  WHERE NOT EXISTS (
     SELECT date 
     FROM "Table" as t2 
     WHERE t2.date = (t1.date - INTERVAL '1 day')
  )
  ORDER BY date
  OFFSET 1  -- this will skip the first element

這將為您提供沒有直接后繼的所有行。

如果將語句修改為:

SELECT date, itemName
  FROM "Table" as t1
  WHERE NOT EXISTS (
    SELECT date 
    FROM "Table" as t2 
    WHERE (t2.date >= (t1.date - INTERVAL '2 day'))
    AND (t2.date < t1.date)
  )
  ORDER BY date
  OFFSET 1

您可以使用subselect的WHERE子句中的INTERVAL長度來過濾至少該大小的間隙。

希望有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM