Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Ошибка в sql

efewf wefwef Ученик (47), на голосовании 1 год назад
BEGIN TRANSACTION;
CREATE TABLE IF NOT EXISTS "events" (
"id" INTEGER,
"cid" INTEGER NOT NULL,
"type" TEXT NOT NULL,
"date" DATETIME NOT NULL,
PRIMARY KEY("id")
);
INSERT INTO "events" ("id","cid","type","date") VALUES (1,0,'start','2021-01-01 00:00:00'),
(2,2,'start','2021-01-01 02:00:00'),
(3,1,'start','2021-01-01 03:00:00'),
(4,0,'end','2021-01-01 06:00:00'),
(5,1,'end','2021-01-01 07:00:00'),
(6,3,'start','2021-01-01 08:00:00'),
(7,3,'end','2021-01-01 08:30:00'),
(8,4,'start','2021-01-01 08:45:00'),
(9,2,'end','2021-01-01 09:00:00'),
(10,5,'start','2021-01-01 10:00:00'),
(11,6,'start','2021-01-01 11:00:00'),
(12,4,'end','2021-01-01 12:00:00'),
(13,5,'end','2021-01-01 13:00:00'),
(14,7,'start','2021-01-01 14:00:00'),
(15,7,'end','2021-01-01 15:00:00'),
(16,6,'end','2021-01-01 16:00:00'),
(17,8,'start','2021-01-01 15:30:00'),
(18,9,'start','2021-01-01 16:30:00'),
(19,10,'start','2021-01-01 17:00:00'),
(20,8,'end','2021-01-01 18:00:00'),
(21,10,'end','2021-01-01 19:00:00'),
(22,11,'start','2021-01-01 19:30:00'),
(23,11,'end','2021-01-01 19:45:00'),
(24,9,'end','2021-01-01 19:59:00');
COMMIT;
WITH sub AS (
SELECT t1.timestamp AS start_time,
MIN(t2.timestamp) AS end_time,
COUNT(*) AS concurrent_processes
FROM events t1
JOIN events t2
ON t2.timestamp >= t1.timestamp AND t2.process_id <> t1.process_id
WHERE t1.event = 'start' AND t2.event = 'end'
GROUP BY t1.timestamp
),
sub2 AS (
SELECT start_time, end_time,
ROW_NUMBER() OVER (ORDER BY concurrent_processes DESC) AS rn
FROM sub
)
SELECT start_time, end_time
FROM sub2
WHERE rn = 1;

Убрать ошибку: Error: near "(": syntax error
Голосование за лучший ответ
Коля Корольченко Гуру (2547) 1 год назад
В SQL-запросе присутствует ошибка синтаксиса в строке, где определены общие таблицы (Common Table Expressions - CTE). В CTE выражениях нужно указать столбцы, которые вы используете, вместо использования алиасов.

Поправленный SQL-запрос выглядит следующим образом:

```sql
BEGIN TRANSACTION;
CREATE TABLE IF NOT EXISTS "events" (
"id" INTEGER,
"cid" INTEGER NOT NULL,
"type" TEXT NOT NULL,
"date" DATETIME NOT NULL,
PRIMARY KEY("id")
);
INSERT INTO "events" ("id","cid","type","date") VALUES (1,0,'start','2021-01-01 00:00:00'),
(2,2,'start','2021-01-01 02:00:00'),
... (вставьте остальные значения) ...
(24,9,'end','2021-01-01 19:59:00');
COMMIT;

WITH sub AS (
SELECT t1.date AS start_time,
MIN( t2.date ) AS end_time,
COUNT(*) AS concurrent_processes
FROM events t1
JOIN events t2
ON t2.date >= t1.date AND t2.cid <> t1.cid
WHERE t1.type = 'start' AND t2.type = 'end'
GROUP BY t1.date
),
sub2 AS (
SELECT start_time, end_time,
ROW_NUMBER() OVER (ORDER BY concurrent_processes DESC) AS rn
FROM sub
)
SELECT start_time, end_time
FROM sub2
WHERE rn = 1;
```

Здесь я заменил алиасы `t1.timestamp` и `t2.timestamp` на соответствующие столбцы ` t1.date ` и ` t2.date `, а также заменил `t2.process_id` и `t1.process_id` на `t2.cid` и `t1.cid` соответственно, так как в таблице нет столбца `process_id`, но есть столбец `cid`, который, вероятно, используется для идентификации процессов.

Теперь запрос должен работать корректно.
Похожие вопросы