Запрос с предложением WITH и подзапросом COUNT - PullRequest
1 голос
/ 13 февраля 2020

В приведенном ниже запросе я не получаю ожидаемых результатов. Есть идеи почему? Как я могу переформулировать такой запрос, чтобы получить желаемые результаты?

Схема (SQLite v3.30)

WITH RECURSIVE
  cnt(x,y) AS (VALUES(0,ABS(Random()%3)) UNION ALL SELECT x+1, ABS(Random()%3) FROM cnt WHERE x<10),
  i_rnd as (SELECT r1.x, r1.y, (SELECT COUNT(*) FROM cnt as r2 WHERE r2.y<=r1.y) as idx FROM cnt as r1)
SELECT * FROM i_rnd ORDER BY y;

результат:

| x   | y   | idx |
| --- | --- | --- |
| 1   | 0   | 3   |
| 5   | 0   | 6   |
| 8   | 0   | 5   |
| 9   | 0   | 4   |
| 10  | 0   | 2   |
| 3   | 1   | 4   |
| 0   | 2   | 11  |
| 2   | 2   | 11  |
| 4   | 2   | 11  |
| 6   | 2   | 11  |
| 7   | 2   | 11  |

ожидаемый результат:

| x   | y   | idx |
| --- | --- | --- |
| 1   | 0   | 5   |
| 5   | 0   | 5   |
| 8   | 0   | 5   |
| 9   | 0   | 5   |
| 10  | 0   | 5   |
| 3   | 1   | 6   |
| 0   | 2   | 11  |
| 2   | 2   | 11  |
| 4   | 2   | 11  |
| 6   | 2   | 11  |
| 7   | 2   | 11  |

Другими словами, idx должен указывать, сколько строк имеют y меньше или равно y рассматриваемой строки.

1 Ответ

1 голос
/ 13 февраля 2020

Я бы просто использовал:

select cnt.*,
       count(*) over (order by y)
from cnt;

Здесь - это db <> скрипка.

Проблема с вашим кодом, вероятно, заключается в том, что CTE вычисляется каждый раз, когда он вызывается, поэтому значения не согласованы - проблема с изменчивыми функциями в CTE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...