在 Oracle 中,我如何获得一个独特站点的列表,这些站点已经被采样了 X 年?

In Oracle, how do I get a list of unique sites where they have been sampled for X number of years?

在 Oracle 中,我如何获得一份独特网站的列表,这些网站已经被抽样了 X 年并且每年至少有一个数据点?我们需要它来确定将哪些站点用于长期趋势分析。我已经能够 select 列出第一个样本发生在 36 年前的不同站点,但不确定我将如何确保每年至少有一个数据点。我感觉一年多做一次 COUNT 可能是一种方法,但不确定完成这项工作的确切语言。

这是示例 table(其中包含我的较大数据集的第一个数据点)。这些数据一直持续到今天。

drop table site_trends;
create table site_trends
 (
  site_id VARCHAR(30),
  date_time DATE,
  ANC VARCHAR(30)
);

insert into site_trends values('DR01', (TO_DATE('11/2/1979', 'mm/dd/yyyy')), 20.77);
insert into site_trends values('WR02', (TO_DATE('11/2/1979', 'mm/dd/yyyy')), 40.97);
insert into site_trends values('DR01', (TO_DATE('11/26/1980', 'mm/dd/yyyy')), 10.67);
insert into site_trends values('WR02', (TO_DATE('11/26/1980', 'mm/dd/yyyy')), 43.5);
insert into site_trends values('DR01', (TO_DATE('11/28/1981', 'mm/dd/yyyy')), 45.1);
insert into site_trends values('WR02', (TO_DATE('11/28/1981', 'mm/dd/yyyy')), 22.87);

这里的代码添加了从今天开始的日期与 39 年前采样的任何站点的采样日期之间的年差。我会使用 DISTINCT(site_id) 为我提供仅包含 site_id 的列表,但这显示了它的一些工作原理。现在我只需要制定一个条件,要求每年每个站点有一个数据点。

SELECT * FROM
(SELECT site_id, date_time, ANC,
TO_CHAR(current_timestamp, 'yyyy') - TO_CHAR(date_time, 'yyyy') AS diff_year
FROM site_trends)
WHERE diff_year > 38
;

可能有很多方法可以做到这一点。我只是按 site_id 和年份分组并进行计数。

select * from (
    select site_id, 
           extract(year from sysdate) - extract(year from date_time) as diff_year,
           count(1) as num_years
    from site_trends
    group by site_id, extract(year from date_time)
) where diff_year > 38 and num_years = diff_year;