如何通过计算显示max函数的结果? [SQLPlus]

How to display result of max function with calculation? [SqlPlus]

我使用 SqlPlus。

有很多相关问题的解决方案和示例,但我无法解决我的问题。

预期结果:1 行给出借书时间最长的图书馆成员的信息。 (显示时间量:ex. Johnson John 有...:31 天)

我当前的查询:

SELECT DISTINCT m.firstname || ' ' || m.lastname || ' has borrowed for the longest time: ' || ROUND(MAX(l.date_of_return - l.date_borrowed)) || ' days' "Longest time borrowed" 
FROM loans l
JOIN members m
ON l.memberid = m.memberid
WHERE l.date_of_return - l.date_borrowed = (SELECT MAX(date_of_return - date_borrowed) FROM loans)

/

使用的表:

LOANS:
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
  ISBN                                                  NOT NULL VARCHAR2(20)
  SERIAL_NO                                             NOT NULL NUMBER(2)
  DATE_BORROWED                                         NOT NULL DATE
  DATE_OF_RETURN                                                 DATE
  MEMBERID                                              NOT NULL VARCHAR2(11)
  EXTEND                                                         VARCHAR2(5)

MEMBERS:
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
  MEMBERID                                              NOT NULL VARCHAR2(11)
  LASTNAME                                              NOT NULL VARCHAR2(20)
  FIRSTNAME                                                      VARCHAR2(20)

错误:

ERROR at line 1: ORA-00937: not a single-group group function

我想我忽略了一个简单的解决方案。提前致谢。

尝试

SELECT m.firstname || ' ' || m.lastname || ' has borrowed for the longest time: ' || ROUND(l.date_of_return - l.date_borrowed) || ' days' "Longest time borrowed" 
FROM loans l
JOIN members m
ON l.memberid = m.memberid
WHERE l.date_of_return - l.date_borrowed = (SELECT MAX(l2.date_of_return - l2.date_borrowed) FROM loans l2) 
  AND ROWNUM <=1

您可能希望避免在内部 select 之外进行额外的基于计算的比较(这可能会在执行期间作为额外的贷款循环结束,从而显着延长 运行 时间)。 应该可以把里面的id收集起来select以及计算结果在外面使用

尝试这样的事情:

SELECT m.firstname, m.lastname, b.maxtime FROM会员m,贷款l 内部联接 ( SELECT li.memberid id, MAX(li.date_of_return - li.date_borrowed) 最大时间 FROM 贷款李 分组依据 li.memberid ) b ON m.memberid = b.id 按 b.maxtime

排序

顺便说一句:这里有一个很好的 post 涵盖了类似的主题(以防万一您在搜索时没有找到这个主题),其中可能包含一些关于您正在尝试做的事情的有趣想法: SQL select only rows with max value on a column