我一直在困扰着下一个问题。我使用大型数据集,其中包含物种观测和位置的记录。这就是我想要做的事情:
对于每个时期(5年),我想知道在该特定时期描述的不同物种的数量,但是在之前的时期没有描述。因此,对于每个新时期,查询需要检查之前是否已经描述过某个物种。这需要在100个不同的区域进行。数据集已经知道记录了5年期间的每条记录。
我的最终结果应该是一个表格,其中x轴为区域,y轴为周期,单元格为每个区域的每个周期所描述的物种数量。如果一个查询可以做到这一点会很棒。但是我打算在Excel中这样做,因为我很乐意为每个区域获取每个区域不同物种的数量。
答案 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