最近,我在 Codility 中练习代码练习。在这里您可以找到问题所在,它位于练习 6 - SQL 部分。刚开始测试看问题描述! SqlEventsDelta
问题定义:
我为 SQLite 中的SqlEventDelta问题编写了这个解决方案。它在本地工具中工作正常但是,它在网络工具中不起作用。
任何人都可以就如何解决这个问题提供任何建议吗?
※ 我在 Stackoverflow 中搜索了这个问题,我知道比我自己的方式更好的代码。 但是,如果可能的话,我想使用我自己的 SQLite 代码逻辑和功能。
WITH cte1 AS
(
SELECT *, CASE WHEN e2.event_type = e2.prev THEN 0
WHEN e2.event_type = e2.next THEN 0
ELSE 1 END AS grp
FROM (SELECT *, LAG(e1.event_type) OVER(ORDER BY (SELECT 1)) AS prev , LEAD(e1.event_type) OVER(ORDER BY (SELECT 1)) AS next FROM events e1) e2
)
,cte2 AS
(
SELECT cte1.event_type, cte1.time, cte1.grp, cte1.value - LAG(cte1.value) OVER(ORDER BY cte1.event_type, cte1.time) AS value
FROM cte1
WHERE cte1.grp = 0
ORDER BY cte1.event_type, cte1.time
)
SELECT c2.event_type, c2.value
FROM cte2 c2
WHERE (c2.event_type, c2.time) IN (
SELECT c2.event_type, MAX(c2.time) AS time
FROM cte2 c2
GROUP BY c2.event_type)
GROUP BY c2.event_type
ORDER BY c2.event_type, c2.time
它在我的本地工具(SQLite 版本 3.12.2 的数据库浏览器)上运行得很好,没有错误。
event_type | value
-----------+-----------
2 | -5
3 | 4
Execution finished without errors.
Result: 2 rows returned in 7ms
但是,在网络工具(Codility 测试编辑器-SQLite 版本 3.11.0)上无法运行,我收到以下错误。
| Compilation successful.
| Example test: (example test)
| Output (stderr):
| error on query: ...
| ...
| ...,
| details: near "(": syntax error
| RUNTIME ERROR (tested program terminated with exit code 1)
Detected some errors.
SqlEventDelta问题:
编写一个 SQL 查询,对于已多次注册的每个 event_type,返回最新的(即时间上最近的)与第二个最新值之间的差值。
- 该表应按 event_type 排序(按升序)。
- 行集中列的名称无关紧要,但它们的顺序很重要。
给定 具有以下结构的表事件:
create table events (
event_type integer not null,
value integer not null,
time timestamp not null,
unique(event_type, time)
);
例如,给定以下数据:
event_type | value | time
-----------+------------+--------------------
2 | 5 | 2015-05-09 12:42:00
4 | -42 | 2015-05-09 13:19:57
2 | 2 | 2015-05-09 14:48:30
2 | 7 | 2015-05-09 12:54:39
3 | 16 | 2015-05-09 13:19:57
3 | 20 | 2015-05-09 15:01:09
鉴于上述数据,输出应返回以下行集:
event_type | value
-----------+-----------
2 | -5
3 | 4
谢谢你。