7

私はSQLServer2008を使用しています。

「Date1」、「Date2」、「Dateblah」の列を持つテーブル「X」があり、すべてタイプがDateTimeであるとします。

たとえば、3つの列の間で最小値を選択したい(簡略化、日付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

2 つ (またはそれ以上) の列の最小値/最大値を返す組み込み関数はありません。これを行うには、独自のスカラー関数を実装できます。

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は 2 つの日付フィールドがDate1ありDate2、そこから最小値が必要です。

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