Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
时间和记录特定选择的SQL代码?_Sql_Database_Postgresql_Dataset - Fatal编程技术网

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

时间和记录特定选择的SQL代码?,sql,database,postgresql,dataset,Sql,Database,Postgresql,Dataset,我一直在为下一个问题绞尽脑汁。我使用一个大型数据集,其中包含物种观察和位置的记录。以下是我想做的: 对于每段时间(5年),我想知道在该特定时期描述的不同物种的数量,但在早期没有描述。因此,对于每一个新时期,查询都需要检查某个物种之前是否还没有被描述过。这需要在100个单独的区域进行。数据集已经知道每个记录在哪个5年期间被记录 我的最终结果应该是一个表格,其中包含x轴上的区域、y轴上的周期,以及每个周期、每个区域中所描述物种的数量。如果一个查询就可以做到这一点,那就太好了。但我计划在Excel中执

我一直在为下一个问题绞尽脑汁。我使用一个大型数据集,其中包含物种观察和位置的记录。以下是我想做的:

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


我的最终结果应该是一个表格,其中包含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