0

最近,我在 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

谢谢你。

4

2 回答 2

1

我试图使用某种天真的方法。我知道由于许多子查询,这对性能非常不利,但这里的问题是 PostgreSQL 的“DISTINCT ON”,但是我得到了 100%

希望你喜欢!

select distinct on (event_type) event_type, result * -1
from (select event_type, value, lead(value) over (order by event_type) - value result
      from (select *
            from events
            where event_type in (select event_type
                                 from events
                                 group by event_type
                                 having count(event_type) >= 2)
            order by event_type, time desc) a) b
于 2021-10-25T13:58:21.050 回答
0

我在使用 sqlite 时确实遇到了同样的问题。尝试在 PostgreSQL 中使用以下代码

with data as (select 
e.event_type,
e.value,
e.time,
lead(e.value,1) over (PARTITION by e.event_type order by e.event_type,e.time asc) as next_val,
lag (e.value,1) over (PARTITION by e.event_type order by e.event_type,e.time asc) as prev_val
from events e)
select distinct d.event_type, (d.value-d.prev_val) as diff
from 
events e,data d
where e.event_type = d.event_type
and d.next_val is null
and e.event_type in ( SELECT event_type
                        from data 
                        group by 
                        event_type
                        having count(1) > 1)
order by 1;
于 2021-12-31T08:30:28.793 回答