用MIN(DATE)选择记录

时间:2012-02-29 01:30:16

标签: sql date min

所以,这是一个非常简单的查询,但是我不确定我是否正确,因为我在纸上制作它并且没有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'
                )

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

3 个答案:

答案 0 :(得分:4)

很高兴看到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。我建议您使用DBMS而不是Oracle,因为创建新表和插入记录的语法可能有点不友好。

现在我也在为你的问题here添加一个答案。我没有粘贴答案,所以你花时间玩它。准备好让你玩的桌子是here,所以这应该是你测试你的查询的起点......但是请记住,总是先尝试在纸上解决它们......你将无法在考试中测试它们:)

答案 1 :(得分:1)

编辑由于您无法使用TOP 1技巧或子查询,因此您需要提出一个条件,使用基本“{less}”来阐明MIN的定义“关系。

在将每个记录与同一个表中的所有记录进行比较时考虑问题。您可以通过构建自联接来执行此操作,以便从您加入的表中选择的所有记录都具有早期日期。会有一些记录无法找到具有严格较早日期的货币对;这是你想要的记录。显然,您需要外部连接才能将基本记录带入结果中,因为匹配不存在。您正在寻找的记录将具有独特的结构,使您可以在不希望看到的记录中识别它。

答案 2 :(得分:0)

从另一个角度来看,问题是要求最早的Serv_Req。从字面上看,结果是单个记录,即最老的记录。既然如此,没有Group By子句的第一次尝试(“我到目前为止写的是:”)将给出答案。 亲吻 - 保持简单明了