В Oracle, как мне получить список уникальных сайтов, где они были выбраны в течение X лет? - PullRequest
0 голосов
/ 23 сентября 2019

В Oracle, как мне получить список уникальных сайтов, где они были отобраны за X лет и имеют хотя бы одну точку данных каждый год?Нам нужно это, чтобы определить, какие сайты использовать для долгосрочного анализа тенденций.Я смог выбрать список отдельных сайтов, где первый образец был обнаружен более 36 лет назад, но не уверен, как мне поступить, чтобы каждый год иметь хотя бы одну точку данных.Я чувствую, что выполнение COUNT в течение года может быть способом сделать это, но я не уверен в точном языке, чтобы это сделать.

Вот пример таблицы (которая содержит первые точки данных моего большего набора данных).).Данные для них сохраняются до сегодняшнего дня.

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
;

1 Ответ

1 голос
/ 23 сентября 2019

Вероятно, есть множество способов сделать это.Я просто сгруппировал бы по 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;
...