SQL计算记录在

时间:2016-02-16 15:26:48

标签: sql oracle

我有一个包含report_datejob_no列的表格,想知道如何返回一个列,显示job_no在当前事件发生之前出现的次数。

我尝试过count(job_no),但我不知道如何设置它只计算当前report_date之前的出现次数。

到目前为止,我不得不将数据导出到excel并执行报告日期的清单<当前的report_date和job_no =当前的job_no,但这太笨重了。

请帮忙! :)

4 个答案:

答案 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