2016-02-16 2 views
0

У меня есть таблица, содержащая столбцы report_date и job_no, и хотелось бы знать, как вернуть столбец, который показывает, сколько раз появилось job_no до текущего появления.SQL подсчет, сколько раз запись появилась до

Я пробовал считать (job_no), но не знаю, как установить это только для подсчета вхождения до текущего report_date.

До сих пор мне приходилось заниматься экспортом данных в excel и выполнением счетов для даты отчета < current report_date и job_no = current job_no, но это слишком неуклюже.

Пожалуйста, помогите! :)

+0

Прежде чем в каком контексте ... что вы сортируете. – Hogan

+2

Можете ли вы опубликовать свои попытки и предоставить дополнительную информацию? Вероятно, некоторые образцы данных также. –

+1

Пожалуйста, прочитайте [** How-to-Ask **] (http://stackoverflow.com/help/how-to-ask) \t \t И вот отличное место для [** START **] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/) –

ответ

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 коррелированного запроса будет подсчитывать, сколько вхождений были там до текущей даты строки.

+0

в этом случае коррелированный подзапрос будет дороже, чем соответствующий аналитическая функция счета. – Sentinel

+1

Этот сайт предназначен для решений, отвечающих запросам OP. Вы не можете предположить, что у него есть ТОНЫ данных, и это будет дорого для него, и вы не должны полагаться на правильный ответ, потому что считаете, что ваш вопрос вернее. @Sentinel – sagi

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 для предыдущих списков (или использовать Windowing положение, что является более сложным).

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 

Предложения оконного в этой версии будет препятствовать подсчету текущей строки, хотя для указанной ситуации просто вычитание 1 и с помощью окна по умолчанию rows between unbounded preceding and current row будет столь же эффективным.

+0

Спасибо, это сработало отлично :) – Jayney

0

Мое впечатление, что у вас установлен параметр даты отчета. Другими словами, ваше сравнение не относится к какому-либо из данных самого отчета.

count(case when report_date < ?report_date then 1 else null end) 
    over (partition by job_no) 

Если вы хотите сделать хотят граф быть по отношению к другим строкам с общим job_no, то вы можете сделать это или подзапрос подхода использовать @ Саги в. (Я думал, что Гордон сделал разные предположения в своем ответе. Приглядевшись, я вижу, что он выглядит как обычно.)

row_number() over (partition by job_no order by report_date) - 1