您好我有以下表格结构:
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),但在这种情况下我无法理解我的逻辑。
非常感谢。
答案 0 :(得分:5)
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 ;
答案 1 :(得分:0)
没有评论真正糟糕的架构(它违反了正常的表单规则 - 我认为它被称为没有重复的组),
我知道的唯一方法是使用案例陈述
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
答案 2 :(得分:0)
SQL: 使用此函数获取最多四个日期之间的最小日期,如果您想找到两列的最小值,只需为 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