#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 года… Я изменил свое представление, и запрос сработал — большое вам спасибо!