Счетчик SQL для столбца даты - PullRequest
8 голосов
/ 04 марта 2010

У меня есть таблица, содержащая набор столбцов, один из которых - столбец Дата.

Мне нужно посчитать, сколько вхождений значений этого столбца относятся к одному и тому же месяцу. И вернуть, если за один месяц эта сумма будет больше 3.

Например:

____________________
| DATE   |  ....    |
---------------------
1998-09-02
1998-09-03
1998-10-03
1998-10-04

Это не должно возвращать никакого значения. Потому что у него нет необходимого количества повторений.

Но это делает:

____________________
| DATE   |  ....    |
---------------------
1998-09-02
1998-09-03
1998-09-12
1998-09-14
1998-10-02
1998-11-21

За ноябрь месяц.

Для БД Oracle.

Ответы [ 9 ]

7 голосов
/ 04 марта 2010
SELECT
 COUNT(date)
 , TRUNC(DATE,'MON')
FROM TABLE
GROUP BY TRUNC(DATE,'MON')
HAVING COUNT(DATE) > 3
3 голосов
/ 04 марта 2010
create table x (date_col date);

insert into x values (date '1998-09-02');
insert into x values (date '1998-09-03');
insert into x values (date '1998-09-12');
insert into x values (date '1998-09-14');
insert into x values (date '1998-10-02');
insert into x values (date '1998-11-21');

SELECT TRUNC(date_col,'MM'), count(*)
FROM x
GROUP BY TRUNC(date_col,'MM')
HAVING count(*) > 3;
1 голос
/ 04 марта 2010

Этот пример поможет:

create table d1
( event_date date, event_description varchar2(100));

insert into d1 values (sysdate,'Phone Call');
insert into d1 values (sysdate,'Letter');
insert into d1 values (sysdate-50,'Interview');
insert into d1 values (sysdate-50,'Dinner with parents');
insert into d1 values (sysdate-100,'Birthday');
insert into d1 values (sysdate-100,'Holiday');
insert into d1 values (sysdate-100,'Interview');
insert into d1 values (sysdate-100,'Phone Call');

commit;

select * from d1;

EVENT_DATE                EVENT_DESCRIPTION                                                                                    
------------------------- ----------------------------------------------- 
04-MAR-10 14.47.58        Phone Call                                                                                           
04-MAR-10 14.47.58        Letter                                                                                               
13-JAN-10 14.47.58        Interview                                                                                            
13-JAN-10 14.47.58        Dinner with parents                                                                                  
24-NOV-09 14.47.58        Birthday                                                                                             
24-NOV-09 14.47.58        Holiday                                                                                              
24-NOV-09 14.47.58        Interview                                                                                            
24-NOV-09 14.47.58        Phone Call                                                                                           
8 rows selected

Вы можете видеть, что ноябрь-09 - единственный месяц, в котором более 3 событий.

Возвращаясь к вашему первоначальному вопросу, который был И верните, если в течение одного месяца это количество будет больше 3 . Будет работать следующий агрегат SQL.

select trunc(event_date,'MONTH'),count('x') from d1 
having count('x') > 3 group by trunc(event_date,'MONTH') 

В качестве альтернативы используйте to_char для преобразования типа Date в Char с изображением MON-YYYY следующим образом:

select to_char(trunc(event_date,'MONTH'),'MON-YYYY') month,
    count('x') no_of_occurances from d1 having count('x') > 3 group trunc(event_date,'MONTH') 
1 голос
/ 04 марта 2010

В идеале вы должны создать хранимую процедуру, которая принимает два необходимых критерия: месяц (целое число) и лимит (целое число)

В параметризованной процедуре, которая выполняет следующее

 SELECT MONTH(Date) AS TheMonth, COUNT(MONTH(Date)) AS TheMonthCount
    FROM MyTable
    GROUP BY MONTH(Date)
    HAVING (COUNT(MONTH(Date)) > @limit) AND (MONTH(Date) = @month)

Чтобы также вывести соответствующий месяц, вы можете использовать следующее

SELECT CAST(YEAR(Date) AS NVARCHAR) + '.' + 
       CAST(MONTH(Date) AS NVARCHAR) AS 'The  ', 
MONTH(Date ) AS TheMonth, COUNT(MONTH(Date)) AS TheMonthCount
    FROM Audit_Entry
    GROUP BY MONTH(Date), 
         CAST(YEAR(Date) AS NVARCHAR) + '.' +            
         CAST(MONTH(Date) AS NVARCHAR)
    HAVING (COUNT(MONTH(Date)) > @limit) AND (MONTH(Date) = @month)
1 голос
/ 04 марта 2010

Итак, если в 3 столбцах содержится 1999-01-xx, вы хотите получить его?

SELECT YEAR(date), MONTH(date) 
FROM table GROUP BY YEAR(date), MONTH(date) 
HAVING COUNT(*) > 3

Если вам нужны все строки, содержащие верхний результат, он должен выглядеть примерно так

SELECT * FROM table 
INNER JOIN (
   SELECT YEAR(date) as y, MONTH(date) as m 
   FROM table GROUP BY YEAR(date), MONTH(date) 
   HAVING COUNT(*) > 3
) as virtualTable 
ON virtualTable.y = YEAR(date) AND virtualTable.m = MONTH(date)
0 голосов
/ 04 марта 2010

Вы можете использовать метод EXTRACT Oracle:

select theMonth, sum(monthCount)
from (
  select 
    extract(MONTH FROM t.theDateColumn) as theMonth,
    1 as monthCount
  )
group by theMonth
having sum(monthCount) >= 3

В данный момент у меня нет базы данных Oracle, поэтому этот код может не работать как есть - я прошу прощения за это.

0 голосов
/ 04 марта 2010

Я не уверен, какую базу данных вы используете.

В MySQL запрос будет аналогичен методу, предложенному @THEn

На сервере SQL у вас есть другие интересные возможности.

Прочтите эту статью для более подробной информации.

0 голосов
/ 04 марта 2010

Это должно работать для mysql и mssql:

SELECT MONTH(date), Sum(MONTH(date))
FROM table
GROUP BY date
HAVING Sum(MONTH(date)) > 3
0 голосов
/ 04 марта 2010

Может быть ошибочным, но предположение:

SELECT SUM(date) FROM table
GROUP BY date where SUM(date) > 3
...