Sql 与MS Access中的最大()函数等效?

Sql 与MS Access中的最大()函数等效?,sql,ms-access,Sql,Ms Access,是否有一个等效的[GREATEST()]函数,我可以将其编码到MS Access SQL语句中?我有一个带有几个日期字段的项目编号表。我想返回一个指定最近日期的输出。实际上,这表明了特定项目的状态 +------------+------------+------------+-----------+------------+-----------+ |ProjectNum | CondCommit | FirmCommit | FundAgt |支付|服务| +------------+---

是否有一个等效的
[GREATEST()]
函数,我可以将其编码到MS Access SQL语句中?我有一个带有几个日期字段的项目编号表。我想返回一个指定最近日期的输出。实际上,这表明了特定项目的状态

+------------+------------+------------+-----------+------------+-----------+
|ProjectNum | CondCommit | FirmCommit | FundAgt |支付|服务|
+------------+------------+------------+-----------+------------+-----------+
| 1898       |            | 1/30/2008  | 2/21/2008 | 6/18/2008  | 6/21/2010 |
| 1906       | 12/20/2004 | 5/19/2006  | 5/3/2006  | 4/6/2006   | 4/5/2007  |
| 1918       | 3/31/2009  | 11/19/2009 | 3/24/2010 | 12/22/2010 |           |
| 1956       | 3/31/2009  |            | 3/5/2010  |            |           |
+------------+------------+------------+-----------+------------+-----------+
我知道我可以使用一个
开关
函数来比较两个日期,但我必须在五个字段中找到最近的日期。理想情况下,我希望输出如下所示:

+------------+------------+------------+
|ProjectNum | Status | StatusDt|
+------------+------------+------------+
|1898年|维修| 2010年6月21日|
|1906年|维修| 4/5/2007|
|1918年|支付日期| 2010年12月22日|
|1956年|基金会| 3/5/2010|
+------------+------------+------------+
我愿意尝试各种各样的函数,但我希望将代码保存在SQL中。如果我必须将输出发送到另一个应用程序进行处理,这有点违背了使用SQL的初衷。

以下是您的解决方案:

  • 创建一个名为
    Status
    的表,其中包含一个名为
    Status
    的列。用唯一的状态填充此字段
  • 为了进行此练习,我将您的输入表(您列出的第一个)称为
    table1
  • 您的代码可以如下所示:

    select
        i.ProjectNum
        ,oo.Status
        ,i.StatusDt
    from (
                select
                    o.ProjectNum
                    ,Max(o.StatusDt) as StatusDt
                from (
                    select 
                        t.ProjectNum
                        ,t.[Status]
                        ,iif(t.[Status] = 'CondCommit',a.CondCommit,
                            iif(t.[Status] = 'FirmCommit',a.FirmCommit,
                                iif(t.[Status] = 'FundAgt',a.FundAgt,
                                    iif(t.[Status] = 'Disbursemt',a.Disbursemt,
                                        iif(t.[Status] = 'Servicing',a.Servicing,null))))) as StatusDt
                    from 
                    (
                    select 
                        table1.ProjectNum
                        ,Status.Status
                    from table1, Status
                    ) as t
                    inner join table1 as a
                        on t.ProjectNum = a.ProjectNum
                ) as o
                group by o.ProjectNum
        ) as i
        inner join (
                select 
                    t.ProjectNum
                    ,t.[Status]
                    ,iif(t.[Status] = 'CondCommit',a.CondCommit,
                        iif(t.[Status] = 'FirmCommit',a.FirmCommit,
                            iif(t.[Status] = 'FundAgt',a.FundAgt,
                                iif(t.[Status] = 'Disbursemt',a.Disbursemt,
                                    iif(t.[Status] = 'Servicing',a.Servicing,null))))) as StatusDt
                from 
                (
                select 
                    table1.ProjectNum
                    ,Status.Status
                from table1, Status
                ) as t
                inner join table1 as a
                    on t.ProjectNum = a.ProjectNum
        ) as oo
        on i.ProjectNum = oo.ProjectNum
        and i.StatusDt = oo.StatusDt
    
    注:

    • 您可以(可能应该)将子查询保存为单独的查询,然后通过引用子查询名称简化上面的查询
    • 但是,我的原始SQL可以按原样运行

    非常感谢。这个查询似乎总是选择最右边的日期,不管它是否是最近的日期。是否可以修改它,使其实际选择“最伟大”的日期?理想情况下,状态总是“从左到右”流动,但也有例外,我希望能够使用此查询捕捉到这一点。我的错误是,它的执行与广告完全相同。(我只是需要更加小心地刷新表)我知道我没有完全按照你的建议去做,但是我在将解决方案实现为完全嵌套的查询时遇到了一些麻烦。你可能有一些很好的洞察力@海绵我回答了你的问题-请检查一下,让我知道它是否适合你。