2014-02-19 2 views
1

У меня есть база данных измерений инвентаризации дерева со схемой следующим образом:Выбор последовательных пары данных

sqlite> .schema mmt 
CREATE TABLE mmt (mmtid INTEGER PRIMARY KEY, plot TEXT, mmtDate TEXT, treeno NUMERIC, fork TEXT, diameter NUMERIC, height NUMERIC, cwn NUMERIC, form NUMERIC, thin TEXT, comments TEXT, row NUMERIC, heightflag TEXT); 
; 

Дерева атрибутов (диаметр и высота) измеряется через каждые несколько лет. Ниже приведен фрагмент данных, соответствующих дереву 1 на графике abc101. Это дерево было измерено в 2000, 2001, 2003, 2006 и 2009 Вилка поля указывает на то, что многочисленные меры были сделаны на одном дереве, но это не относится к данным, следующим образом:

sqlite> select * from mmt where plot = "abc101" and treeno = 1 ; 
mmtid|plot|mmtDate|treeno|fork|diameter|height|cwn|form|thin|comments|row|heightflag 
45488|abc101|2000-06-23 00:00:00|1|NULL|14.7||2|2|||1| 
45497|abc101|2001-07-20 00:00:00|1|NULL|15.6||2|2|||1| 
53683|abc101|2003-09-03 00:00:00|1|NULL|17.3||1|2|||1| 
62435|abc101|2006-08-22 00:00:00|1|NULL|20.4|19.25|1|1|||1|H 
71314|abc101|2009-01-14 00:00:00|1|NULL|24.1|20.4|1|1|||1|H 

Я хотел бы для структурирования данных, так что я могу просматривать последовательные пары измерений, что-то вроде:

plot|mmt1date|treeno|fork|dbh1|mmt2date|dbh2 
abc101|2000-06-23 00:00:00|1|NULL|14.7|2001-07-20 00:00:00|15.6 
abc101|2001-07-20 00:00:00|1|NULL|15.6|2003-09-03 00:00:00|17.3 

и т.д.

Я уверен, что это довольно простая задача. К сожалению, мой sql не такой, какой он может быть, и я не нашел рабочего решения на этом этапе. Можете ли вы посоветовать подходящий подход?

ответ

1

Вам необходимо самостоятельное объединение. К сожалению, sqlite не поддерживает некоторые умные методы, связанные с функциями окон.

SELECT * 
FROM mmt m1 JOIN mmt m2 
ON m1.plot = m2.plot /* whatever else identifies the tree */ 
AND m2.mmtDate = 
    (SELECT MIN(mmtDate) FROM mmt m3 
    WHERE m3.plot = m1.plot AND m3.mmtDate > m1.mmtDate); 

Обратите внимание, вы можете получить более высокую производительность с помощью ORDER BY m3.mmtDate LIMIT 1 в подзапроса.

Если это большой стол, я бы предложил сделать специальную таблицу поиска в течение многих лет, которые имели записи, введенные в порядке возрастания с шагом 1.

sequence_number year 
1     2000 
2     2001 
3     2003 /* etc */ 

т.д.

, а затем попробуйте

SELECT * 
FROM mmt m1 JOIN mmt m2 
ON m1.plot = m2.plot /* whatever else identifies the tree */ 
    JOIN year_list y1 ON year(m1.mmtDate)=y1.year 
    JOIN year_list y2 ON year(m2.mmtDate)=y2.year 
    AND y1.sequence_number = y2.sequence_number-1; 
Смежные вопросы