如何通过计算显示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
我使用 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