поиск диапазона дат из полей минимальной и максимальной даты

#sql-server

#sql-server

Вопрос:

Я пытаюсь найти самый ранний экземпляр даты для уникального идентификатора (уникальный идентификатор содержит несколько строк данных с разными датами), а затем отфильтровать этот результат, чтобы найти данные между 2005 и 2010 годами, используя подзапрос. Я продолжаю получать «Неправильный синтаксис рядом с ключевым словом «group»:

 Select *
from (select custnum, YEAR(min(Date_field)) as field1, Field2, field3, field4, field5   
        from table1
        group by custnum, field2, field3, field4, field5)
    having YEAR(min(Date_field)) between 2005 and 2010
  

Есть идеи?
Спасибо за вашу помощь-

Комментарии:

1. является ли custnum вашим уникальным идентификатором?

2. Попробуйте получить having YEAR(min(Date_field)) between 2005 and 2010 в подзапросе.

3. Вы используете подзаголовок select без его псевдонима, и ваше having предложение находится во внешнем select , а group by в подзаголовке select . Вы также ссылаетесь на подполе select Date_field во внешнем select , где оно не существует.

4. Custnum — это уникальный идентификатор

Ответ №1:

Если я вас правильно понял, вы можете использовать:

 WITH CTE AS
(
    SELECT  custnum,
            Field2,
            Field3,
            Field4,
            Field5,
            Field1 = MIN(Date_Field) OVER(PARTITION BY custnum)
    FROM dbo.table1
)
SELECT *
FROM CTE
WHERE Field1 BETWEEN '20050101' AND '20101231';
  

Комментарии:

1. @Gross И есть ли у вас строки, в которых минимальная дата для a custnum находится между 2005 и 2010 годами?. Какой Date_Field тип данных?

2. да — данные, которые у меня есть, содержат несколько строк с одинаковым числом пользователей с диапазонами дат от 1982 до текущего. тип поля даты — datetime

3. извините… Я изменил представление, к которому обращается этот запрос, чтобы оно было активными записями, у которых не было бы даты до 2010 года… Я изменил свое представление, и запрос сработал — большое вам спасибо!