2014-01-30 54 views
0

我一直在困擾關於下一個問題我的大腦。我使用包含物種觀測和位置記錄的大型數據集。這是我想做的事:時間和記錄特定選擇的SQL代碼?

對於時間(5年),我想知道,在那個特定的時期進行了描述不同的物種的數量各個時期,但並沒有在前期描述。因此,對於每個新的時期,查詢需要檢查某個物種之前是否已經描述過。這需要完成100個獨立的區域。數據集已經知道每個記錄中記錄了5年的時間。

我的最終結果應該是一個表,在x軸的區域,在y軸上的週期,並且在所述細胞中所述物種對於每個週期,每單位面積的數量。如果只有一個查詢是可能的,那將是非常好的。但我打算在Excel中這樣做,因爲我很樂意爲每個區域獲得每個時間段內不同物種的數量。

回答

1

PostgreSQL支持窗口化聚合函數:

SELECT 
    area, period, SUM(x) AS newSpecies 
FROM 
(
    SELECT area, period, 
     CASE -- check for the first description 
     WHEN date_col = MIN(date_col) OVER (PARTITION BY species) THEN 1 
     ELSE 0 
     END AS x 
    FROM au.trans 
) AS dt 
GROUP BY area, period 

根據數據你可能需要切換到ROW_NUMBER代替: CASE - 檢查第一說明 WHEN ROW_NUMBER()OVER(PARTITION BY種訂單BY列date_col)= 1,則1 ELSE 0 END爲X

現在,你只需要轉動的數據,不知道是否有PostgreSQL中旋轉功能,否則你將需要做的經典MAX(案件)。對於每個區域你需要添加一個

SELECT period, 

    -- cut&paste&modify for each area 
    MAX(CASE WHEN area = 'area52' THEN newSpecies ELSE 0 END AS area52, 
    .... 
FROM (previous query) AS dt 
GROUP BY period 
+0

謝謝!!有效! – user3252532