【问题标题】:SQL select minimum date from same columnSQL从同一列中选择最小日期
【发布时间】:2014-09-23 20:02:28
【问题描述】:

我正在尝试根据帐户及其合同编写查询。该表包含每个帐户的所有合同,合同是否有效、已过期等。我希望查询只带回每个帐户最早开始日期的合同,因此每个帐户只有一行。但是我不知道每个帐户的最早合同的状态。有些可能有活动,有些可能有待处理。我现在遇到了一个问题,如果合同状态在我指定的列表中,它会为每个帐户带回多个记录。下面是简单的示例代码:

Select t.account, t.contract, t.status Min(t.start_date)
From table t
where t.status in ('Active','Countersigned','Pending')

【问题讨论】:

  • 您是否缺少GROUP BY
  • 你能写一个你想看的数据的例子吗?
  • 您使用的是哪个 DBMS?后格雷斯?甲骨文?

标签: sql date record min


【解决方案1】:

如果您的数据库支持它(例如 Oracle、Postgres、SQL Server,但不支持 MySQL 或 SQLite),您可以使用窗口函数。例如,您可以通过starting_at 对每个账户中的合约进行排名:

SELECT *, rank() OVER (PARTITION BY account_id ORDER BY starting_at ASC) AS rank
FROM   contracts

然后您可以在子查询中使用它来加入帐户,并且只接受排名为 1 的合同。您需要将其放在子查询中,因为不幸的是(至少在 Postgres 中)您 不能在 WHERE 中使用窗口函数。所以这行不通:

SELECT *, rank() OVER (PARTITION BY account_id ORDER BY starting_at ASC) AS rank
FROM   contracts
WHERE  rank = 1

但这会:

SELECT *
FROM (SELECT *, rank() OVER (PARTITION BY account_id ORDER BY starting_at ASC) AS rank
      FROM   contracts) x
WHERE rank = 1

请注意,您可以轻松地将按状态等过滤添加到任何这些查询中。

【讨论】:

    【解决方案2】:

    这应该可行:

    select account, contract, status, MinDate
    from
    (
    Select t.account, t.contract, t.status, t.start_date,
    Min(t.start_date) over(partition by t.account) MinDate
    From table t
    where t.status in ('Active','Countersigned','Pending')
    ) x
    where start_date=MinDate
    

    【讨论】:

      【解决方案3】:

      如果您在同一个 MIN(date) 上的每个帐户没有多个合同,则该解决方案有效(在这种情况下,您会为每个帐户获得多行,并且您应该决定要查看这 N 个合同中的哪一个,我不能替你做决定)

      SELECT t.*
      FROM (
          Select t.account, Min(t.start_date) AS MinDate
          From table t
          where t.status in ('Active','Countersigned','Pending')
          GROUP BY t.account
      ) AS t2
      INNER JOIN table t ON t.account = t2.account AND t.start_date = t2.MinDate 
      

      【讨论】:

        猜你喜欢
        • 2019-06-28
        • 2014-07-26
        • 2014-01-24
        • 2021-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-09
        • 1970-01-01
        相关资源
        最近更新 更多