【问题标题】:SQL code for time and record specific selection?时间和记录具体选择的SQL代码?
【发布时间】:2014-02-22 19:03:47
【问题描述】:
我一直在思考下一个问题。我使用一个包含物种观察和位置记录的大型数据集。这是我想做的:
对于每个时期(5 年),我想知道在该特定时期被描述但在更早时期没有被描述的不同物种的数量。因此,对于每个新时期,查询需要检查某个物种是否以前没有被描述过。这需要针对 100 个单独的区域进行。数据集已经知道每条记录是在哪个 5 年期间记录的。
我的最终结果应该是一个表格,其中 x 轴为区域,y 轴为周期,单元格中每个区域的每个周期描述的物种数量。如果通过一个查询就可以做到这一点,那就太好了。但我计划在 Excel 中执行此操作,因为我很乐意获得每个区域、每个时间段不同物种的数量。
【问题讨论】:
标签:
sql
database
postgresql
dataset
【解决方案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——检查第一个描述
当 ROW_NUMBER() OVER (PARTITION BY species ORDER BY date_col) = 1 THEN 1
否则 0
结束为 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