7

我正在使用 SQL Server 2008;

假设我有一个表“X”,其中包含“Date1”、“Date2”、“Dateblah”列,所有类型均为 DateTime。

我想选择三列之间的最小值,例如(简化,带日期 mm/dd/yyyy)

ID       Date1          Date2           Dateblah
0     09/29/2011      09/20/2011       09/01/2011 
1     01/01/2011      01/05/2011       03/03/2010

ID    MinDate
0    09/01/2011
1    03/03/2010

有没有面包和黄油命令可以做到这一点?

提前致谢。

编辑:我见过这个问题从几列中选择最小值的最佳方法是什么?但不幸的是,它不适合我,因为我有义务反对规范化,因为我正在制作 tfs 工作项报告,如果我有 6 ou 7,“蛮力”案例最终会很痛苦列。

4

4 回答 4

9

基于标量函数(来自Tom Hunter):

SELECT ID, (SELECT MIN([date]) FROM (VALUES(Date1),(Date2),(Dateblah)) x([date])) MinDate
FROM TableName
于 2013-02-05T16:20:27.200 回答
6

没有内置函数可以返回两个(或更多)列的最小值/最大值。您可以实现自己的标量函数来执行此操作。

在 SQL Server 2005+ 中,您可以使用UNPIVOT将列转换为行,然后使用 MIN 函数:

CREATE TABLE [X]
(
    [ID] INT,
    [Date1] DATETIME,
    [Date2] DATETIME,
    [Date3] DATETIME
)

INSERT  [X]
VALUES  (0, '09/29/2011', '09/20/2011', '09/01/2011'),
        (1, '01/01/2011', '01/05/2011', '03/03/2010')


SELECT [ID], MIN([Date]) AS [MinDate]
FROM [X]
UNPIVOT (
    [Date] FOR d IN
        ([Date1]
        ,[Date2]
        ,[Date3])
) unpvt
GROUP BY [ID]
于 2011-09-29T13:46:23.583 回答
1

实现一个标量函数:

CREATE FUNCTION [dbo].[MIN](@a SQL_VARIANT, @b SQL_VARIANT)
RETURNS SQL_VARIANT
AS 
BEGIN
    RETURN (
        SELECT MIN([x])
        FROM (VALUES(@a),(@b)) x([x])
    )   
END
GO

DECLARE @a DATETIME = '12 JUL 2011', @b DATETIME = '20 AUG 2011'
SELECT [dbo].[MIN](@a, @b)

DECLARE @c INT = 12, @d INT = 32
SELECT [dbo].[MIN](@c, @d)
于 2011-09-29T14:08:00.710 回答
0

简单地说,您的日期被调用的表格,sells它有两个日期字段Date1Date2您希望从中获得最小值。

SELECT ( 
   SELECT MIN([x]) 
   FROM (VALUES(Date1),(Date2)) x([x])
) as minimum
FROM sells
于 2014-07-26T15:19:59.710 回答