SQL получить имя perticuler, расположенное в середине запроса - PullRequest
0 голосов
/ 11 марта 2020

У меня есть столбец фрукты, и у него есть строки, такие как

banana
pineapple
orange
grapes
apple
mango
pomegranate
Kiwi
grapefruit
peach

или, может быть, как это

 pineapple
 grapefruit
 orange
 grapes
 apple
 mango
 pomegranate
 Kiwi
 banana
 peach

Я хочу получить все это с grapefruit в середине все время, подобное следующему, независимо от того, имеет ли оно четное или нечетное количество строк

banana
pineapple
orange
grapes
grapefruit
apple
pomegranate
Kiwi
mango

Я знаю основы c SQL запрос SELECT fruit FROM FRUITTABLE, но не знаю дальше

Ответы [ 3 ]

2 голосов
/ 11 марта 2020

Вы можете заказать по is_even/is_odd на некотором перечислении. (здесь: разница в row_number() над ничего )


\i tmp.sql

CREATE TABLE fruits(fruit text);
INSERT INTO fruits(fruit) VALUES
('banana') ,('pineapple') ,('orange') ,('grapes') ,('apple') ,('mango') ,('pomegranate') ,('Kiwi') ,('grapefruit') ,('peach')
        ;

with numbered AS (
        select fruit, row_number() OVER () rn
        FROM fruits
        )
, gnum AS (
        SELECT rn FROM numbered
        WHERE fruit = 'grapefruit'
        )
SELECT n.fruit, n.rn
FROM numbered n
JOIN gnum g ON true
ORDER BY ((n.rn - g.rn) %2), (n.rn <> g.rn)
        ;

Результат:


CREATE TABLE
INSERT 0 10
    fruit    | rn 
-------------+----
 mango       |  6
 grapes      |  4
 Kiwi        |  8
 pineapple   |  2
 grapefruit  |  9
 banana      |  1
 orange      |  3
 apple       |  5
 pomegranate |  7
 peach       | 10
(10 rows)

Редактировать: t ie -разрушитель не всегда корректен (вызвано по модулю отрицательных чисел). Лучший порядок будет


ORDER BY (ABS(n.rn - g.rn) %2) , (n.rn <> g.rn) DESC
1 голос
/ 11 марта 2020

Я думаю, вы должны объяснить, почему вы хотите это сделать, может быть, есть лучший способ получить желаемый результат.

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

Таблица с примерами

SELECT *
FROM Fruits
ORDER BY Weight;
0 голосов
/ 11 марта 2020

Не могли бы вы сделать:

(select * from fruit where id < (select max(id)/2 from fruit))
union select * from fruit where id = grapefruit
union
(select * from fruit where id > (select max(id)/2 from fruit))

или что-то в этом роде. Если у вас нет идентификатора, возможно, вам придется использовать rownumber, но это должно быть выполнимо.

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