SQLite Получение нескольких результатов с LIMIT 1 - PullRequest
0 голосов
/ 18 февраля 2020

У меня следующая проблема.

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

SELECT UserEMail FROM Visitor
JOIN Ticket ON Visitor.UserEMail = Ticket.VisitorUserEMail
where Ticket.Date> date('2000-01-01') AND Ticket.Date < date ('2020-12-31')
Group by Ticket.VisitorUserEMail
order by SUM(Price) DESC;

Можно ли вывести более одного человека, если оба потратили одинаковое количество?

Ответы [ 2 ]

0 голосов
/ 18 февраля 2020

Используйте CTE, который возвращает все итоговые цены для каждого электронного письма, и с помощью NOT EXISTS выберите строки с верхней общей ценой:

WITH cte AS (
  SELECT VisitorUserEMail, SUM(Price) SumPrice 
  FROM Ticket 
  WHERE Date >= '2000-01-01' AND Date <= '2020-12-31'
  GROUP BY VisitorUserEMail
)
SELECT c.VisitorUserEMail
FROM cte c
WHERE NOT EXISTS (
  SELECT 1 FROM cte
  WHERE SumPrice > c.SumPrice
)

или:

WITH cte AS (
  SELECT VisitorUserEMail, SUM(Price) SumPrice 
  FROM Ticket 
  WHERE Date >= '2000-01-01' AND Date <= '2020-12-31'
  GROUP BY VisitorUserEMail
)
SELECT VisitorUserEMail
FROM cte 
WHERE SumPrice = (SELECT MAX(SumPrice) FROM cte)

Обратите внимание, что вам не нужна функция date(), потому что результат date('2000-01-01') равен '2000-01-01'. Также я думаю, что условия в предложении WHERE должны включать =, верно?

0 голосов
/ 18 февраля 2020

Использование rank():

SELECT VisitorUserEMail
FROM (SELECT VisitorUserEMail, SUM(PRICE) as sum_price,
             RANK() OVER (ORDER BY SUM(Price) DESC) as seqnum
      FROM Ticket t
      WHERE t.Date >= date('2000-01-01') AND Ticket.Date <= date('2021-01-01')
      GROUP BY t.VisitorUserEMail
     ) t
WHERE seqnum = 1;

Примечание: вам не нужно JOIN, при условии, что покупатели билетов на самом деле посетители. Если это предположение неверно, используйте JOIN.

...