2015-08-03 41 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) 

因此,如果今天是2015年1月5日我期望的结果是:

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 

这一定与Some条款有关,不是吗? 感谢

+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

欢呼声, 会有多个结果,而不仅仅是一个,这就是为什么我有句子,这反过来又需要一个分组。 我正在寻找符合该标准的所有结果,而不仅仅是顶级的结果 – scamper

+1

如果没有'order by'子句,永远不要使用'top'子句,否则结果将是随机的且不明确排序。 – jpw

0

似乎没有必要使用group by。我会建议只需按升序来选择它们。这将显示所有符合标准的值,其次是最低的,比今天更高。

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和customer分区,你的问题并没有真正说明。

相关问题