SQLite Nested Query для максимального - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь использовать DB Browser для SQLite, чтобы создать вложенный запрос для определения ВТОРОГО предмета с наивысшей ценой, приобретенного 10 лучшими спонсорами.Запрос, который я должен выбрать из 10 самых больших расходов:

SELECT user_id, max(item_total), SUM (item_total + shipping_cost -
discounts_applied) AS total_spent 
FROM orders AS o
WHERE payment_reject = "FALSE" 
GROUP BY user_id 
ORDER BY total_spent DESC 
LIMIT 10

Это дает user_id, самый дорогой предмет, который они купили (не считая доставку или скидки), а также общую сумму, которую они потратили на сайте..

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

SELECT user_id, MAX(item_total) AS second_highest
  FROM orders
 WHERE item_total < (SELECT user_id, SUM (item_total + shipping_cost -
discounts_applied) AS total_spent 
FROM orders 
WHERE payment_reject = "FALSE" 
GROUP BY user_id 
ORDER BY total_spent DESC 
LIMIT 10)
group by user_id

Я получаю сообщение об ошибке неверного значения строки.Есть ли у кого-нибудь указатели на этот вложенный запрос или известен другой способ найти второй по величине предмет, купленный в группе, найденной в первом запросе?Спасибо!

1 Ответ

0 голосов
/ 30 января 2019

(Примечание: ниже предполагается, что вы используете Sqlite 3.25 или новее, поскольку он использует оконные функции).

Это вернет второй по величине item_total для каждого user_id без дубликатов:

WITH ranked AS
 (SELECT DISTINCT user_id, item_total
       , dense_rank() OVER (PARTITION BY user_id ORDER BY item_total DESC) AS ranking
  FROM orders)
SELECT user_id, item_total FROM ranked WHERE ranking = 2;

Вы можете объединить его с исходным запросом с помощью чего-то вроде:

WITH ranked AS
 (SELECT DISTINCT user_id, item_total
       , dense_rank() OVER (PARTITION BY user_id ORDER BY item_total DESC) AS ranking
  FROM orders),
 totals AS
 (SELECT user_id
       , sum (item_total + shipping_cost - discounts_applied) AS total_spent 
  FROM orders
  WHERE payment_reject = 0 
  GROUP BY user_id)
SELECT t.user_id, r.item_total, t.total_spent
FROM totals AS t
JOIN ranked AS r ON t.user_id = r.user_id
WHERE r.ranking = 2
ORDER BY t.total_spent DESC, t.user_id
LIMIT 10;

Хорошо, после исправления определения таблицы, чтобы лучше отражать значения, хранящиеся в нем, и заявленныепроблема, исправление данных и добавление к ним, чтобы вы могли получить результаты, а также необязательный, но полезный индекс, например:

CREATE TABLE orders (order_id INTEGER PRIMARY KEY
                   , user_id INTEGER
                   , item_total REAL
                   , shipping_cost NUMERIC
                   , discounts_applied NUMERIC
                   , payment_reject INTEGER);
INSERT INTO orders(user_id, item_total, shipping_cost, discounts_applied
                 , payment_reject) VALUES (9852,60.69,10,0,FALSE),
 (2784,123.91,15,0,FALSE), (1619,119.75,15,0,FALSE), (9725,151.92,15,0,FALSE),
 (8892,153.27,15,0,FALSE), (7105,156.86,25,0,FALSE), (4345,136.09,15,0,FALSE),
 (7779,134.93,15,0,FALSE), (3874,157.27,15,0,FALSE), (5102,108.3,10,0,FALSE),
 (3098,59.97,10,0,FALSE),  (6584,124.92,15,0,FALSE), (5136,111.06,10,0,FALSE),
 (1869,113.44,20,0,FALSE), (3830,129.63,15,0,FALSE), (9852,70.69,10,0,FALSE),
 (2784,134.91,15,0,FALSE), (1619,129.75,15,0,FALSE), (9725,161.92,15,0,FALSE),
 (8892,163.27,15,0,FALSE), (7105,166.86,25,0,FALSE), (4345,146.09,15,0,FALSE),
 (7779,144.93,15,0,FALSE), (3874,167.27,15,0,FALSE), (5102,118.3,10,0,FALSE),
 (3098,69.97,10,0,FALSE),  (6584,134.92,15,0,FALSE), (5136,121.06,10,0,FALSE), 
 (1869,123.44,20,0,FALSE), (3830,139.63,15,0,FALSE);
CREATE INDEX orders_idx_1 ON orders(user_id, item_total DESC);

, приведенный выше запрос даст:

user_id     item_total  total_spent
----------  ----------  -----------
7105        156.86      373.72     
3874        157.27      354.54     
8892        153.27      346.54     
9725        151.92      343.84     
4345        136.09      312.18     
7779        134.93      309.86     
3830        129.63      299.26     
6584        124.92      289.84     
2784        123.91      288.82     
1619        119.75      279.5      

(Если вы получаете синтаксическую ошибку из запроса сейчас, это потому, что вы используете старую версию sqlite, которая не поддерживает оконные функции.)

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