Выберите с конца таблицы, пока выбор не содержит количество допустимых значений - PullRequest
0 голосов
/ 04 октября 2019

У меня есть таблица SQLite, подобная следующей:

gary_ages
====================
Name     | Age
--------------------
Gary 1   | 20
Gary 2   | 50
Gary 3   | 35
Gary 4   | 71
Gary 5   | 50
Gary 6   | 4
Gary 7   | 50
Gary 8   | 65
Gary 9   | 91
Gary 10  | 50
Gary 11  | 0

Вы можете видеть, что Гари 2, 5, 7 и 10 50 лет.

Я хотел бы сделатьвыбор, начиная с конца таблицы, который содержит 3 Гари, возраст которых составляет 50 лет. В этом случае этот выбор будет варьироваться от Гари 5 до Гари 11.

  • Выбор содержит 3Гари в возрасте 50 лет.

  • Это будет не , включая Гари 2, так как тогда в нем будет 4 Гари в возрасте 50 лет, а мне нужно только 3 *. 1016 *

  • Выбор включает , включая Гари 11, потому что Гари 11 находится в конце таблицы, где начинается выбор.

  • выбор включает всех Гари в возрасте от 5 до 11, хотя не всем из них 50 лет.

  • выбор не включает Гари3 и 4, потому что в подборке уже 3 Гари в возрасте 50 лет, и они больше не заботятся о Гари.

Используя SQLite через Python, я могу сделать это довольно легко, выбрав последнюю строку таблицы, проверив, равняется ли общее число 50-х 3, и либо выбрав следующую строку, либо вернув текущий выбор в виде списка Python, в зависимости. Но в идеале я хотел бы ограничить это миром SQLite.

Есть ли простое решение?

SELECT * FROM gary_ages WHERE ...

Ответы [ 2 ]

2 голосов
/ 04 октября 2019

Я верю, что

SELECT * FROM gary_ages WHERE rowid >= (SELECT min(rowid) FROM (SELECT rowid FROM gary_ages WHERE Age = 50 ORDER BY rowid DESC LIMIT 3));

Вернет: -

enter image description here

То есть

  • самый внутренний подзапрос выбирает 3 последних 50-летних,
  • внешний подзапрос затем выбирает самый низкий rowid из 3 последних 50-летних,
  • самый низкий rowid, являющийсяиспользуется для управления предложением WHERE, в которое будут включены все значения rowid, равные или превышающие полученный младший rowid.
1 голос
/ 04 октября 2019

В одну сторону:

WITH ranked AS
 (SELECT rowid, row_number() OVER (ORDER BY rowid DESC) AS rn
  FROM gary_ages
  WHERE age = 50)
SELECT name
FROM gary_ages
WHERE rowid >= (SELECT rowid FROM ranked WHERE rn = 3)
ORDER BY rowid;
name
----------
Gary 5
Gary 6
Gary 7
Gary 8
Gary 9
Gary 10
Gary 11

(Примечание: требуется Sqlite 3.25 или более поздняя версия для row_number())

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