Как обрабатывать связи с не максимальными значениями в SQLite - PullRequest
0 голосов
/ 08 октября 2019

Мне дали базу данных с просьбой распечатать первые десять значений базы данных, если не было сопоставления - если было сопоставление, распечатайте все значения, связанные с 10-м значением. Я много читал об обработке связей с MAX и WITH TIES, но я не могу найти решение для печати связей для чего-то, что не является максимальным значением, и использование WITH TIES, похоже, не помогает мне,Есть ли какой-нибудь простой способ сделать это, или мне нужно пройти через некоторые обручи?

Например, моя база данных содержит

10, 10, 10, 10, 9, 9, 9, 9, 8, 7, 7, 7, 7, 7, 2

Результат, который я в настоящее время получаю, равен LIMIT 10, где мой результат:

10, 10, 10, 10, 9, 9, 9, 9, 8, 7

Но я бы хотел, чтобы моя программа возвратила

10, 10, 10, 10, 9, 9, 9, 9, 8, 7, 7, 7, 7, 7

Есть ли способ сделать это?

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

Требуется rank() оконная функция (требуется sqlite 3.25 или более поздняя версия):

sqlite> CREATE TABLE x(v INTEGER);
sqlite> INSERT INTO x VALUES (10),(10),(10),(10),(9),(9),(9),(9),(8),(7),(7),(7),(7),(7),(2);
sqlite> SELECT v, rnk
   ...> FROM (SELECT v, rank() OVER (ORDER BY v DESC) AS rnk FROM x)
   ...> WHERE rnk <= 10
   ...> ORDER BY rnk;
v           rnk
----------  ----------
10          1
10          1
10          1
10          1
9           5
9           5
9           5
9           5
8           9
7           10
7           10
7           10
7           10
7           10

После сортировки чисел каждой группе одинаковых чисел присваивается одинаковый рейтинг,с рангом следующей группы, основанным на общем количестве строк до сих пор - почему 9 - это ранг 5 вместо 2 (для этого поведения используйте dense_rank() вместо).

0 голосов
/ 08 октября 2019

Есть ли способ сделать это?

Я верю, что следующее будет делать то, что вы хотите: -

SELECT * FROM mytable WHERE val >= (SELECT min(val) FROM  (SELECT * FROM mytable ORDER BY val DESC LIMIT 10));
  • очевидно,имя таблицы mytable и имя столбца val , возможно, придется изменить в соответствии с именами таблицы и столбца.

То есть самый внутренний запрос возвращает 10 самых высокихСтроки, из которых получено наименьшее значение, приводят предложение WHERE основного запроса.

Пример / Демонстрация

DROP TABLE IF EXISTS mytable;
CREATE TABLE IF NOT EXISTS mytable (val INTEGER);
INSERT INTO mytable VALUES (10), (10), (10), (10), (9), (9), (9), (9), (8), (7), (7), (7), (7), (7), (2);
SELECT * FROM mytable WHERE val >= (SELECT min(val) FROM  (SELECT * FROM mytable ORDER BY val DESC LIMIT 10));

приводит к: -

enter image description here

Если вы действительно хотите, чтобы результат был 10, 10, 10, 10, 9, 9, 9, 9, 9, 8, 7, 7, 7,7, 7 как один ряд, тогда вы можете использовать: -

SELECT group_concat(val) FROM mytable WHERE val >= (SELECT min(val) FROM  (SELECT * FROM mytable ORDER BY val DESC LIMIT 10));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...