【问题标题】:MSSQL get id and the min (earliest) of four datesMSSQL 获取 id 和四个日期的最小值(最早)
【发布时间】:2014-05-28 11:02:42
【问题描述】:

我在 mssql (2005) 中有一个表,其中有四个日期列和一个 ID 列。

我想返回所有四列的最小日期和相关的 id。

SELECT TOP 1 min(date1), min(date2), min(date3), min(date4)  FROM datatable
WHERE  date1 > CAST(? AS DATETIME) OR 
     date2 > CAST(? AS DATETIME) OR
     date3 > CAST(? AS DATETIME) OR
     date4 > CAST(? AS DATETIME) 

然后我在 php 中对日期进行排序,以给我最小行。我不知道如何将返回 id 添加到此。

【问题讨论】:

    标签: php sql sql-server sql-server-2005


    【解决方案1】:

    您可以将列转轴为行,然后使用TOP 1 选择最小值(因为这还可以让您找出四列中的哪一列是最小值):

    SELECT  t.ID, upvt.Date, upvt.ColumnName
    FROM    Datatable AS t
            CROSS APPLY
            (   SELECT  TOP 1 ColumnMame, Date
                FROM    (VALUES 
                            ('Date1', Date1),
                            ('Date2', Date2),
                            ('Date3', Date3),
                            ('Date4', Date4)
                        ) AS d (ColumnName, Date)
                ORDER BY d.Date 
            ) AS upvt
    

    编辑

    刚刚看到这是 SQL Server 2005,因此您不能使用表值构造函数来取消透视数据,您需要使用 SELECTUNION ALL

    SELECT  t.ID, upvt.Date, upvt.ColumnName
    FROM    Datatable AS t
            CROSS APPLY
            (   SELECT  TOP 1 ColumnMame, Date
                FROM    (   SELECT Columnname = 'Date1', Date = Date1 UNION ALL
                            SELECT Columnname = 'Date2', Date = Date2 UNION ALL
                            SELECT Columnname = 'Date3', Date = Date3 UNION ALL
                            SELECT Columnname = 'Date4', Date = Date4
                        ) AS d
                ORDER BY d.Date 
            ) AS upvt;
    

    【讨论】:

      【解决方案2】:
      SELECT id_column, date1
      FROM datatable
      WHERE (date1 < date2) AND (date1 < date3) AND (date1 < date4)
      UNION
      SELECT id_column, date2
      FROM datatable
      WHERE (date2 < date1) AND (date2 < date3) AND (date2 < date4)
      UNION
      SELECT id_column, date3
      FROM datatable
      WHERE (date3 < date1) AND (date3 < date2) AND (date3 < date4)
      UNION
      SELECT id_column, date4
      FROM datatable
      WHERE (date4 < date1) AND (date4 < date2) AND (date4 < date3)
      

      【讨论】:

      • 这是我最终使用的解决方案,因为如果对我来说更冗长,它似乎更简单。
      猜你喜欢
      • 2021-09-29
      • 2021-12-15
      • 2016-12-18
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      • 2021-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多