时间和记录特定选择的SQL代码?

时间:2014-01-30 12:54:32

标签: sql database postgresql dataset

我一直在困扰着下一个问题。我使用大型数据集,其中包含物种观测和位置的记录。这就是我想要做的事情:

对于每个时期(5年),我想知道在该特定时期描述的不同物种的数量,但是在之前的时期没有描述。因此,对于每个新时期,查询需要检查之前是否已经描述过某个物种。这需要在100个不同的区域进行。数据集已经知道记录了5年期间的每条记录。

我的最终结果应该是一个表格,其中x轴为区域,y轴为周期,单元格为每个区域的每个周期所描述的物种数量。如果一个查询可以做到这一点会很棒。但是我打算在Excel中这样做,因为我很乐意为每个区域获取每个区域不同物种的数量。

1 个答案:

答案 0 :(得分: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:           案例 - 检查第一个描述              当ROW_NUMBER()超过(按物种分类ORDER BY date_col)= 1那么1              ELSE 0           END AS x

现在你只需要转动那些数据,不知道PostgreSQL中是否有PIVOT函数,否则你需要做经典MAX(CASE)。对于每个区域,您需要添加

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