2015-08-03 1 views
2

Я ищу, чтобы найти следующую самую низкую дату, большую, чем сегодня, в заявлении select. Я упростил данные в качестве примера.SQL Server 2005 следующая самая низкая дата больше, чем сегодня

Пример данных: table_1

name order_no order_date Due_date Run_no 
customer1 abc1 01/04/2015 02/05/2015 1 
customer2 def2 02/04/2015 02/05/2015 2 
customer3 ghi1 03/04/2015 02/05/2015 3 
customer2 def3 04/04/2015 04/05/2015 2 
customer2 def4 05/04/2015 05/05/2015 2 

и пример запроса:

select 
    name, 
    order_no, 
    order_date, 
    Due_date, 
    Run_no 
from 
    table_1 
where 
    run_no = '2' 
group by 
    name, order_no, Order_date, Due_date, Run_no 
having 
    MIN(due_date) > DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0) 

так что если сегодня был 01/05/2015 я бы ожидать, что результат будет:

name order_no order_date Due_date Run_no 
customer2 def2 02/04/2015 02/05/2015 2 

но я действительно получаю:

name order_no order_date Due_date Run_no 
customer2 def2 02/04/2015 02/05/2015 2 
customer2 def3 04/04/2015 04/05/2015 2 
customer2 def4 05/04/2015 05/05/2015 2 

Это должно быть чем-то связанным с предложением, не так ли? Благодаря

+0

Я бы предложил использовать функцию ранжирования ROW_NUMBER(). –

ответ

0

почему не только что-то вроде этого:

Select top(1) 
name, 
order_no, 
order_date, 
Due_date, 
Run_no 
from table_1 
Where run_no ='2'and MIN(due_date) > DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0) 

Я не понимаю, почему вы поставите группу мимо. При необходимости добавьте заказ order_no.

+0

cheers, будет несколько результатов, а не только один, вот почему у меня была фраза, которая, в свою очередь, нуждается в группе. Я ищу все результаты, которые соответствуют этим критериям, а не только топ-к сожалению – scamper

+1

Никогда не используйте предложение 'top' без предложения' order by', результаты будут случайными и недетерминированными без явного упорядочения. – jpw

0

похоже не требуется использование группа. Я бы предложил просто выбрать их в порядке возрастания. Который будет отображать все значения, отвечающие критериям, со следующим самым низким, большим, чем сегодня, сверху.

select < your columns > 
from table_1 
Where run_no ='2' and due_date > DATEADD(day, DATEDIFF(day, 0,GETDATE()), 0) 
order by due_date 
1

Начиная с SQL Server 2005 вы можете использовать функцию row_number для нумерации строк и если вы сделаете это на основе даты (в наборе строк, которые попадают после указанной даты начала), это просто вопрос о выборе строки с номером 1.

select 
    name, 
    order_no, 
    order_date, 
    Due_date, 
    Run_no  
from 
    (select 
     *, 
     rn = row_number() over (partition by name order by due_date asc) 
    from table_1 
    where 
     run_no = '2' and 
     Due_date > DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0) 
) t 
where rn = 1; 

partition by часть функции делает это так, что номера строк будет перезапущен с 1 для каждого нового элемента (клиента) в перегородке, так что вы можете получить совпадающие строки для многих клиентов , Возможно, это не то, что вы хотите - может быть, вы всего лишь одна строка или, может быть, хотите разбить на run_no и клиента, ваш вопрос на самом деле не говорит.

 Смежные вопросы

  • Нет связанных вопросов^_^