sql - 查找最晚或最早的日期

标签 sql oracle

我有一个表,其中包含一个名为 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。

Game ERD

这应该是最终的工作代码。

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/

相关文章:

java - 加密 clob 的最佳方法是什么?

sql - SQL 中的 tstamp 周围绝对没有函数?每小时历史数据查询

java - 压缩字符串并将其作为字符串存储在数据库中以供以后解压

mysql - SQL,在 SQL 行中查找 "Paths"(分组依据/区别)?

mysql - 如何从电子邮件中选择@domain并使用mysql从另一个表中匹配

oracle - 我可以更改 Oracle 中的隔离级别吗?

linux - 使用 Oracle 12.1 客户端在 Linux 中迁移应用程序时在查询中添加小数秒

php - 回显数据作为输入值

mysql - 这个 UPDATE 查询有什么作用?

sql - 为什么即使条件计算结果为 false,也会创建在 IF 语句内声明的变量?