单行子查询 returns 多行 BUT 一行

Single-row subquery returns more than one row BUT with one row

“CityJail”模式。我应该找到提交日期和听证日期之间的平均天数少于平均天数的每个上诉。

这是我的代码:

SELECT appeal_ID
FROM appeals
WHERE (hearing_date - filing_date) <
(SELECT AVG(hearing_date - filing_date)
FROM appeals
GROUP BY appeal_ID)
GROUP BY appeal_ID;

我收到一个错误:

ORA-01427: single-row subquery returns more than one row 01427. 00000 - "single-row subquery returns more than one row" *Cause:
*Action:

求平均值本身就很好:

SELECT AVG(hearing_date - filing_date) "Average"
FROM appeals;

2810.666666666666666666666666666666666667

所以我在想:它不喜欢我的“GROUP BY”,所以我开始将它们一一注释掉:

SELECT appeal_ID
FROM appeals
WHERE (hearing_date - filing_date) <
(SELECT AVG(hearing_date - filing_date)
FROM appeals;
--GROUP BY appeal_ID)
--GROUP BY appeal_ID;

现在我收到错误:

ORA-00920: invalid relational operator 00920. 00000 - "invalid relational operator" *Cause:
*Action: Error at Line: 4 Column: 2

上诉table:

Name         Null?    Type      
------------ -------- --------- 
APPEAL_ID    NOT NULL NUMBER(5) 
CRIME_ID     NOT NULL NUMBER(9) 
FILING_DATE           DATE      
HEARING_DATE          DATE      
STATUS                CHAR(1)

我认为您不需要任何 GROUP BY 子句:

SELECT appeal_ID
FROM appeals
WHERE hearing_date - filing_date < (SELECT AVG(hearing_date - filing_date) FROM appeals)

子查询计算两个日期在整个范围内的平均差 table - 这里不要使用 GROUP BY 子句,否则会 return 多行,并生成那个错误。外部查询可能也不需要聚合。

您也可以用 window 函数来表示:

select *
from (select a.*, avg(hearing_date - filing_date) over() avg_diff from appeals a) a
where hearing_date - filing_date < avg_diff