Получить минимальное значение между несколькими столбцами - PullRequest
6 голосов
/ 29 сентября 2011

Я использую SQL Server 2008;

Предположим, у меня есть таблица 'X' со столбцами 'Date1', 'Date2', 'Dateblah', все с типом DateTime.

Я хочу выбрать минимальное значение между тремя столбцами, например (упрощенное, с датой мм / дд / гггг)

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 или 7 столбцов.

Ответы [ 4 ]

8 голосов
/ 05 февраля 2013

на основе скалярной функции (из Том Хантер ):

SELECT ID, (SELECT MIN([date]) FROM (VALUES(Date1),(Date2),(Dateblah)) x([date])) MinDate
FROM TableName
5 голосов
/ 29 сентября 2011

Нет встроенной функции для возврата мин / макс двух (или более) столбцов. Вы можете реализовать свою собственную скалярную функцию для этого.

В 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]
1 голос
/ 29 сентября 2011

Реализация скалярной функции:

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)
0 голосов
/ 26 июля 2014

Просто скажем, что таблица, в которой находятся ваши даты, называется sells, и в ней есть два поля даты Date1 и Date2, из которых вы хотите минимум.

SELECT ( 
   SELECT MIN([x]) 
   FROM (VALUES(Date1),(Date2)) x([x])
) as minimum
FROM sells
...