我有一个包含report_date
和job_no
列的表格,想知道如何返回一个列,显示job_no
在当前事件发生之前出现的次数。
我尝试过count(job_no),但我不知道如何设置它只计算当前report_date之前的出现次数。
到目前为止,我不得不将数据导出到excel并执行报告日期的清单<当前的report_date和job_no =当前的job_no,但这太笨重了。
请帮忙! :)
答案 0 :(得分:1)
您需要的是相关的子查询:
SELECT s.job_no,(select count(*) from YourTable t
where t.report_date < s.report_date and t.job_no = s.job_no)
FROM YourTable s
这样,对于每个job_no,相关查询将计算当前行日期之前出现的次数。
答案 1 :(得分:1)
只需使用累积计数:
select t.job_no, t.report_date,
count(*) over (partition by t.job_no order by t.report_date) as cumecnt
from t;
严格来说,这包括当前日期,因此您可能希望为之前的列表减去1(或使用窗口条款,这更复杂)。
答案 2 :(得分:1)
分析计数可以满足您的需求:
select job_no
, report_date
, count(*) over (partition by job_no
order by report_date
rows between unbounded preceding and 1 preceding) cnt
from your_table
此版本中的windowing子句将阻止对当前行进行计数,但是对于所述情况,简单地减去1并使用rows between unbounded preceding and current row
的默认窗口同样有效。
答案 3 :(得分:0)
我的印象是你有一个固定的报告日期参数。换句话说,您的比较与报告本身中的任何数据无关。
count(case when report_date < ?report_date then 1 else null end)
over (partition by job_no)
如果你想做希望计数相对于具有公共job_no
的其他行,那么你可以这样做或使用@ sagi的子查询方法。 (我以为戈登在他的回答中做了不同的假设。仔细观察,我看到他的外表像往常一样坚固。)
row_number() over (partition by job_no order by report_date) - 1