2

こんにちは、次のテーブル構造があります。

Person    Date1             Date2............Daten
------    -----             -----            -----
1         2001-01-01        2002-01-01
2         2003-01-01        2000-01-01

そして、Date1とDate(n)の間の最小日付を選択したい(私の場合は20日)。たとえば、Person1 には Date1 を選択し、Person2 には Date2 を選択します。

明らかに、日付列が1つしかない場合は min(Date) を使用できますが、この場合、ロジックを正しく取得できません。

どうもありがとう。

4

3 に答える 3

7
SELECT person AS the_person
  , LEAST(date1 ,date2, date3, date4, date5, ..., dateN ) AS the_date
FROM the_table ;

Least()NULL が存在する場合は無視する必要があります。(上記はPostgresで機能します)

UPDATE (@WarrenT のおかげ) どうやらDB2には がありませんがLEAST()MIN()代わりにあります (複数の引数があります)。

SELECT person AS the_person
  , MIN(date1 ,date2, date3, date4, date5, ..., dateN ) AS the_date
FROM the_table ;
于 2013-07-10T14:42:20.100 に答える
0

本当に悪いスキーマについてコメントせずに(通常の形式の規則に違反しています-繰り返しグループなしと呼ばれていると思います)、
私が知っている唯一の方法は、 case ステートメントを使用することです

 Select case 
       When Date1 < Date2 And Date1 < date3 and date1 < date4 and ... Then date1
       When Date2 < Date1 And Date2 < date3 and date2 < date4 and ... Then date2
       When Date3 < Date1 And Date3 < date2 and date3 < date4 and ... Then date3
       When Date4 < Date1 And Date4 < date2 and date4 < date3 and ... Then date4
       ...
       End as MinDate
 From table        
于 2013-07-10T14:40:10.047 に答える
0

SQL: この関数を使用して、最大 4 つの日付の間で最小の日付を取得します。2 つの列の最小値を見つけたい場合は、date3 と date4 に null を渡すだけです。

--Use this function to get least date 
--SELECT dbo.GetLeastDate('2021-01-19 01:09:28.997', '2021-01-19 01:07:28.997', '2021-01-19 00:02:28.997', '2021-01-19 02:05:28.997') as theDate  
--SELECT dbo.GetLeastDate('2021-01-19 01:09:28.997', '2021-01-19 01:07:28.997', '2021-01-19 02:05:28.997', null) as theDate  
--SELECT dbo.GetLeastDate('2021-01-19 01:09:28.997', '2021-01-19 01:07:28.997', null, null) as theDate  
--SELECT dbo.GetLeastDate('2021-01-19 01:09:28.997', null, null, null) as theDate  
CREATE OR ALTER FUNCTION [dbo].[GetLeastDate]
(
    @d1 datetime,
    @d2 datetime,
    @d3 datetime,
    @d4 datetime
)
RETURNS datetime
AS
BEGIN
    DECLARE @least datetime

    IF @d1 is null
       and @d2 is null
       and @d3 is null
        RETURN null

    Set @d1 = Isnull(@d1, getDate())
    Set @d2 = Isnull(@d2, getDate())
    Set @d3 = Isnull(@d3, getDate())
    Set @d4 = Isnull(@d4, getDate())
    
    IF @d1 < @d2 and @d1 < @d3 and @d1 < @d4
        SET @least = @d1
    ELSE IF @d2 < @d1 and @d2 < @d3 and @d2 < @d4
        SET @least = @d2
    ELSE IF @d3 < @d1 and @d3 < @d2 and @d3 < @d4
        SET @least = @d3
    ELSE
        SET @least = @d4

    RETURN @least
END
于 2021-02-24T11:34:03.080 に答える