我有一个表,其中包含一个名为 team_ID
的外键、一个名为 game_date
的日期列和一个名为 result
的单个字符列。我需要找到下一场 Volley 比赛何时举行。我已成功将比赛日期缩小到所有尚未发生的 Volley 比赛,因为结果 IS NULL
。我已经排列了所有选择,我只需要找到最早的日期。
这是我得到的:
SELECT game.game_date, team.team_name
FROM game
JOIN team
ON team.team_id = game.team_id
WHERE team.sport_id IN
(SELECT sport.sport_id
FROM sport
WHERE UPPER(sport.sport_type_code) IN
(SELECT UPPER(sport_type.sport_type_code)
FROM sport_type
WHERE UPPER(sport_type_name) like UPPER('%VOLLEYBALL%')
)
)
AND game.result IS NULL;
我是一名时间旅行者,所以不要介意旧的日期。
当我运行它时,我得到这个:
GAME_DATE TEAM_NAME
----------- ----------
11-NOV-1998 BEars
13-NOV-1998 BEars
13-NOV-1998 WildCats
14-NOV-1998 BEars
如何设置才能仅获得该日期的MIN(DATE)
和TEAM_NAME
比赛信息?
我已经尝试过 AND game.game_date = MIN(game.game_date)
但它只是告诉我这里不允许使用组函数。必须有一种方法来检索 MIN(game_date)
并将其用作要满足的条件。
我正在使用 Oracle 11g pl/sql。
这应该是最终的工作代码。
SELECT *
FROM
(
SELECT g.game_date, t.team_name
FROM game g
JOIN team t
ON t.team_id = g.team_id
JOIN sport s
ON t.sport_id = s.sport_id
JOIN sport_type st
ON UPPER(s.sport_type_code) IN UPPER(st.sport_type_code)
WHERE UPPER(sport_type_name) like UPPER('%VOLLEYBALL%')
AND g.result IS NULL
ORDER BY g.game_date
)
WHERE ROWNUM = 1;
最佳答案
ROWNUM
伪列在任何 ORDER BY
之前生成子句应用于查询。如果你这样做WHERE ROWNUM <= X
那么你会得到X
行以任何顺序 Oracle 从数据文件而不是 X
生成数据最小行数。为了保证获得最小行,您需要使用 ORDER BY
首先,然后过滤 ROWNUM
像这样:
SELECT *
FROM (
SELECT g.game_date, t.team_name
FROM game g
JOIN team t
ON t.team_id = g.team_id
INNER JOIN sport s
ON t.sport_id = s.sport_id
INNER JOIN sport_type y
ON UPPER( s.sport_type_code ) = UPPER( y.sport_type_code )
WHERE UPPER( y.sport_type_name) LIKE UPPER('%VOLLEYBALL%')
AND g.result IS NULL
ORDER BY game_date ASC -- You need to do the ORDER BY in an inner query
)
WHERE ROWNUM = 1; -- Then filter on ROWNUM in an outer query.
如果您想返回具有最小日期的多行,则:
SELECT game_date,
team_name
FROM (
SELECT g.game_date,
t.team_name,
RANK() OVER ( ORDER BY g.game_date ASC ) AS rnk
FROM game g
JOIN team t
ON t.team_id = g.team_id
INNER JOIN sport s
ON t.sport_id = s.sport_id
INNER JOIN sport_type y
ON UPPER( s.sport_type_code ) = UPPER( y.sport_type_code )
WHERE UPPER( y.sport_type_name) LIKE UPPER('%VOLLEYBALL%')
AND g.result IS NULL
)
WHERE rnk = 1;
关于sql - 查找最晚或最早的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36095657/