2015-02-06 40 views
1

我想查找select语句内的最小值,如:所谓findMin 假设有功能,SQL服务器功能找到最少N个值

select 
    select min from findMin(firstDate,secondDate,thirdDate,....NDate), 
    firstDate, 
    secondDate, 
    thirdDate, 
    .... (having N number of dates) 
from 
    dateTable 

我无法写的SQL Server 2008 R2中findMin功能。

有帮助吗?

感谢

+0

做一个相关的子选择您现在正在尝试做findmin。但你的桌子看起来如何?大量的日期列,也许更好的想法,而不是几行? – jarlh 2015-02-06 11:50:21

+0

您正在寻找许多数据库支持的'most()'和'least()'函数。但不是SQL Server。 – 2015-02-06 11:51:16

+0

@GordonLinoff是啊多数民众赞成在我也知道,这就是为什么我问了这个问题 – canpoint 2015-02-06 11:52:53

回答

2

您可以使用此找到的最早日期:

SELECT 
    MinDate.mDate, 
    dt.firstDate, 
    dt.secondDate, 
    dt.thirdDate 
FROM 
    dateTable dt 
outer apply 
(
    SELECT min(mDate) 
    FROM (values(firstDate), (secondDate), 
     (ThirdDate), (FourthDate)) x(mDate) 
) MinDate 
+0

谢谢@ t-clausen.dk我已经删除了外部申请和在选择语句 – canpoint 2015-02-06 12:57:28

+0

中添加direclty也是一种方法。我不确定哪个执行速度更快。如果我是你,我会比较性能和@ GordonLinoff的答案,然后再使用这种方法 – 2015-02-06 13:01:59

+0

性能是否可比? “Apply”通常是相当优化的,在这种情况下可能工作得很好。 – 2015-02-06 13:05:02

1

SQL Server不支持least()greatest()(唉)。如果值是从来没有NULL,下面的逻辑很麻烦,但你想要做什么了五次约会:

select (case when date1 <= date2 and date1 <= date3 and date1 <= date4 and date1 <= date5 
      then date1 
      when date2 <= date3 and date2 <= date4 and date2 <= date5 
      then date2 
      when date3 <= date4 and date3 <= date5 
      then date3 
      when date4 <= date5 
      then date4 
      else date5 
     end) 

这可以很容易地推广到更多的日期。它只需要更多的逻辑。

还有另一种方法是将数据取消转换并重新聚合。但是,这比仅在单行内进行操作要昂贵得多。