Найдите минимальную временную метку для каждого имени, а затем посчитайте, сколько имен в каждой временной метке
select timestamp, count(*) as new_names from
(select name, min(timestamp) as timestamp from mytable
group by name)
group by timestamp
order by timestamp
Чтобы включить все дни, даже без имен
select t.timestamp, nvl(new_names,0) as new_names from
(select timestamp, count(*) as new_names from
(select name, min(timestamp) as timestamp from mytable
group by name)
group by timestamp) c
RIGHT OUTER JOIN (select distinct timestamp from mytable) t
ON c.timestamp = t.timestamp
order by t.timestamp
Чтобы включить даты, которые не не появляется в таблице вообще, вам нужно где-то иметь список дат из календаря, а затем поместить эту таблицу вместо подзапроса, к которому у меня ПРАВАЯ ВНЕШНЯЯ ПОДКЛЮЧЕНА
Вы можете сделать это
select t.timestamp, nvl(new_names,0) as new_names from
(select timestamp, count(*) as new_names from
(select name, min(timestamp) as timestamp from mytable
group by name)
group by timestamp) c
RIGHT OUTER JOIN (
SELECT TRUNC (SYSDATE - ROWNUM - 1) dt
FROM DUAL CONNECT BY ROWNUM < 366
) t
ON c.timestamp = t.timestamp
order by t.timestamp
Но вам нужно настроить -1 и 366 на желаемый диапазон дат, и гораздо более стандартно использовать календарь, который уже существует в вашей базе данных