当前位置: 首页 > 面试题库 >

选择过去3项比赛中未获得第一名的终点

易宣
2023-03-14
问题内容

假设我有一个运动会结果数据库,结构如下

DATE,NAME,FINISH_POS

我希望进行查询以选择运动员至少参加过三项比赛而没有获胜的所有行。例如,下面的示例数据

2013-06-22,Johnson,2
2013-06-21,Johnson,1
2013-06-20,Johnson,4
2013-06-19,Johnson,2
2013-06-18,Johnson,3
2013-06-17,Johnson,4
2013-06-16,Johnson,3
2013-06-15,Johnson,1

以下行:

2013-06-20,Johnson,4
2013-06-19,Johnson,2

将被匹配。我只设法从以下存根开始:

select date,name FROM table WHERE ...;

我一直在努力把我的头缠在where子句上,但是我什至无法开始


问题答案:

我认为这可以更简单/更快:

SELECT day, place, athlete
FROM  (
   SELECT *, min(place) OVER (PARTITION BY athlete
                              ORDER BY day
                              ROWS 3 PRECEDING) AS best
   FROM   t
   ) sub
WHERE  best > 1

- > SQLfiddle的

使用聚合函数min()作为窗口函数来获取最后三行加上当前行的最小位置。
然后best > 1必须在下一个查询级别对“ no win”()进行细微的检查,因为在子句 之后
应用了窗口函数WHERE。因此,您需要至少一个CTE的子选择条件才能满足窗口函数结果的条件。

手册中有关窗口函数调用的详细信息。特别是:

如果 frame_end 省略,则默认为CURRENT ROW

如果placefinishing_pos)可以为NULL,请改用以下方法:

WHERE  best IS DISTINCT FROM 1

min()忽略NULL值,但是如果框架中的所有行均为NULL,则结果为NULL

不要使用类型名称和保留字作为标识符,我会用day您代替date

假设每天最多进行1场比赛,否则您必须定义如何在时间轴上与同龄人打交道或使用timestamp代替date

@Craig已经提到了索引以使其快速。



 类似资料:
  • http://codepen.io/anon/pen/wjzqww?editors=1010

  • 问题内容: 我正在尝试使所有子字符串与乘数匹配: 此示例按预期返回最后一个匹配项: 但是,我希望所有的字符串都由匹配,以得到如下内容: 有没有办法通过单个功能来做到这一点? 问题答案: 根据Kobi: PHP不支持捕获同一组 因此,这个问题没有解决方案。

  • 以下代码起作用: 如何将第二行重构为: 您对所选的******选项使用了什么?

  • 我正在开发一个Android应用程序,其中一个功能是让用户选择要打开的文件(我想打开一个纯文本的.txt文件)。我以前用Java开发过Android应用程序,但这次我使用的是Kotlin,而且这是我第一次使用Kotlin。 我现在让应用程序显示一个文件选择器,让用户点击他们想要打开的文件。然后我尝试使用File对象打开文件并执行forEachLine循环。但是由于某种原因,它抛出了一个java.i

  • 考虑下面这个游戏。有一组正数。每个玩家依次移除一个切片(连续的元素序列),这样它的和就是偶数。输的玩家是不能移动的玩家。对于< code>[4,5,3,7,2]示例,获胜策略(对于第一个玩家)是移除< code>[5,3]切片。您需要确定第一个玩家是否有赢棋(如果有,返回< code>slice_start和< code>slice_end索引)。 时间/空间复杂度:< code>O(n) 我想到

  • 此组件来自https://github.com/skratchdot/react-bootstrap-multiselect handleChange()函数中应该写什么?