随着时间的推移选择新的不同值 (ORACLE SQL)

多米尼克·萨约维奇

我想选择新的不同值并随着时间的推移跟踪它们。

我有一个表格,其中每一行代表授予特定人的分数。- 时间戳(得分的时间) - 姓名(得分的人) - 得分(得分的人)

在此处输入图片说明

我希望结果看起来像:

在此处输入图片说明

上表应解释为每天出现多少个新的不同名称。

因为 6-NOV 是第一天,所以所有的名字都是新的,所以有 3 个新的名字。
11 月 7 日迈克尔是唯一的新名字,所以值是
1。11 月 8 日我们有 3 个新名字(唐、亚历克斯、蒂娜)
11 月 9 日出现新名字,吉米和萨拉都曾得分.

谢谢您的帮助

阿利斯泰尔

找到每个名字的最小时间戳,然后计算每个时间戳中有多少个名字

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

要包含根本没有出现在表中的日期,您需要在某处有一个日历中的日期列表,然后将该表而不是我有 RIGHT OUTER JOINed 的子查询

你可以这样做

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 调整为您想要的日期范围,并且使用数据库中已经存在的日历更加标准

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章