【问题标题】:Select the record with the MIN(DATE)选择带有 MIN(DATE) 的记录
【发布时间】:2012-03-18 12:58:56
【问题描述】:

所以,这是一个非常简单的查询,但我不确定我是否做对了,因为我是在纸上制作的,并且没有可以试用的 DBMS。 这是大学考试的练习。 我有这张桌子:

    Serv_req
    =============
PK  Svr_ID
    State
    Req_Date
    Description

他们只是要求我显示状态为“打开”的最旧 Serv_Req 的数据。

到目前为止我写的是:

SELECT Svr_ID, State, Description, MIN(Req_Date)
FROM Serv_req
WHERE State LIKE 'Open'
GROUP BY Svr_ID, State, Description

现在,这将只返回包含最旧 Svr_req 信息的记录吗?还是会返回所有“开放”需求的列表,最后只包含最旧的日期?

更新

我忘了提。不幸的是,课程规则不允许我们使用SELECT TOPLIMIT 1,甚至是子查询在FROM 语句中创建辅助表。

提前感谢你们的帮助!

更新 2 好的,所以,在看到我写的第一个查询完全错误之后,我再试一次。 如果您认为这是正确的,请告诉我:

SELECT Svr_id, State, Description
FROM Serv_req
WHERE State LIKE 'Open'
AND Req_Date = (SELECT MIN(S1.Req_date)
                FROM Serv_req S1
                WHERE S1.State LIKE 'Open'
                )

我知道这不是执行此查询的最清晰/最有效的方法,但由于我的课程所施加的限制,这是我能想到的最好的方法。你们有什么感想?看起来对吗?

【问题讨论】:

  • 您确定需要显示哪个服务器、它的状态和描述吗?
  • @gangreen 嗯,是的,这就是书上所说的:)。这可能有点令人困惑,但这实际上不是服务器,而是“服务要求”。所以它要求我显示最旧的服务需求状态是“打开”
  • 我问的原因是因为提出的问题是不确定的。如果 2 个开放式服务要求恰好在同一个最短日期,会发生什么情况?

标签: sql date min


【解决方案1】:

很高兴见到 ARG 的其他人 :)

嗯,基本上你的查询不起作用。您需要删除第二个SELECT,但只删除关键字,而不是字段。至于您提出的问题,我认为您还没有完全了解GROUP BY

在这种情况下,GROUP BY 将采用所有不同的Svr_ID, State, Description(即构成唯一元组),MIN(Req_Date) 将从每个不同的元组分组的元素中取出最小值。

现在,如果 Svr_ID 是一个 PK,您的 GROUP BY 实际上不会对任何内容进行分组,因为 Svr_ID 本身是“不同的”,无论状态和描述字段如何。这意味着查询与此查询相同:

SELECT Svr_ID, State, Description, Req_Date
FROM Serv_req
WHERE State LIKE 'Open'

是不是清楚一点?

编辑:

现在,您说您没有可以尝试这些查询的 DBMS,所以让我向您介绍SQLFiddle。我会向您推荐除 Oracle 之外的任何 DBMS,因为创建新表和插入记录的语法可能有点不友好。

现在我还要为您的问题here 添加一个答案。我没有粘贴答案,以便您花时间玩它。准备好供您使用的表格是here,因此这应该是您测试查询的起点...但请记住,请始终尝试先在纸上解决它们...您将无法测试它们在考试中:)

【讨论】:

  • 嘿!这对我来说也是一个惊喜:),好吧,毕竟这是一个小世界。我更新了我的答案以删除SELECT。我什至不知道这是从哪里来的!这是一个错字关于GROUP BY 我明白你的意思。基本上,此查询将返回所有记录。我现在将用另一种我认为可能可行的方法来更新我的答案。让我知道你的想法!
  • 哇,哇,哇!我无法强调我一直在寻找这样的东西!谢谢谢谢谢谢!!这太棒了,我终于可以尝试我的查询了! :D 实际上,我只是尝试了我在状态中更新的那个,它起作用了!谢谢大佬!
  • 欢迎您!一个提示:因为它是一个考试,你应该尽量避免这些子查询,因为它们的性能不是很好。不确定您是否应该在测试中提及这一点,但这可能有助于证明解决方案的合理性(如有必要)
  • 好吧,实际上我知道那些子查询是解决这个问题的可怕方法,但他们实际上想“测试我们知道子查询”,这就是为什么他们不会让我们使用更简单的, 性能解决方案
【解决方案2】:

编辑由于您不能使用TOP 1 技巧或子查询,因此您需要提出一个条件,使用基本的“小于”关系来说明MIN 的定义。

从将每条记录与同一张表中的所有记录进行比较的角度考虑问题。您可以通过构建一个自联接来做到这一点,这样您从加入的表中选择的所有记录都有一个较早日期。将有一些记录无法找到日期严格较早的配对;那就是你想要的记录。显然,您需要一个 outer 连接来将基本记录带入结果中,因为匹配项不存在。您正在查找的记录将具有独特的结构,让您可以在不想看到的记录中识别它。

【讨论】:

  • 是的,对不起,我忘了澄清。我不能SELECT TOP,或LIMIT 1,甚至FROM 语句中的子查询:(。如果你问我有点傻,但这些是课程规则
【解决方案3】:

从另一个角度来看,问题要求最旧的 Serv_Req。从字面上看,结果是一条记录,即最旧的打开记录。在这种情况下,没有 Group By 子句的第一次尝试(“到目前为止我写的是:”)将给出答案。 KISS - 保持非常简单

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 2016-05-24
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多