时间和记录特定选择的SQL代码?
我一直在为下一个问题绞尽脑汁。我使用一个大型数据集,其中包含物种观察和位置的记录。以下是我想做的: 对于每段时间(5年),我想知道在该特定时期描述的不同物种的数量,但在早期没有描述。因此,对于每一个新时期,查询都需要检查某个物种之前是否还没有被描述过。这需要在100个单独的区域进行。数据集已经知道每个记录在哪个5年期间被记录时间和记录特定选择的SQL代码?,sql,database,postgresql,dataset,Sql,Database,Postgresql,Dataset,我一直在为下一个问题绞尽脑汁。我使用一个大型数据集,其中包含物种观察和位置的记录。以下是我想做的: 对于每段时间(5年),我想知道在该特定时期描述的不同物种的数量,但在早期没有描述。因此,对于每一个新时期,查询都需要检查某个物种之前是否还没有被描述过。这需要在100个单独的区域进行。数据集已经知道每个记录在哪个5年期间被记录 我的最终结果应该是一个表格,其中包含x轴上的区域、y轴上的周期,以及每个周期、每个区域中所描述物种的数量。如果一个查询就可以做到这一点,那就太好了。但我计划在Excel中执
我的最终结果应该是一个表格,其中包含x轴上的区域、y轴上的周期,以及每个周期、每个区域中所描述物种的数量。如果一个查询就可以做到这一点,那就太好了。但我计划在Excel中执行此操作,因为我非常乐意获得每个区域每个时间段不同物种的数量。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()超过(按物种顺序按日期划分)=1时,则为1
其他0
以x结尾
现在,您只需要透视数据,不知道PostgreSQL中是否有透视函数,否则您将需要执行经典的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