Выберите максимум суммы и максимум количества подзапроса - PullRequest
1 голос
/ 03 апреля 2020

У меня есть запрос, который дает мне сумму и количество по категориям. Отсортировано по убыванию. Первое значение - это максимальное значение, поэтому наибольшая сумма и наибольшее количество.

SELECT SUM(score) AS calcsum, category
INTO newdataset
FROM table1 INNER JOIN
     table2
     ON table1.keys  =table2.ID
WHERE table2.filter = "Value"
GROUP BY category
ORDER BY SUM(score) DESC;

соответственно

SELECT count(*) as counted, category
INTO newdataset
FROM table1 INNER JOIN
     table2
     ON table1.keys  =table2.ID
WHERE table2.filter = "Value"
GROUP BY category
ORDER BY count(*) DESC;

Однако теперь я не хочу список, я просто хочу максимальное значение. Я хочу реализовать это сначала с максимальным количеством и максимальным количеством. И второй способ - просто извлечь первое наблюдение из списка.

Первый метод, который я попробовал:

SELECT category, MAX(calcsum)
FROM (
SELECT SUM(score) AS calcsum, category
INTO newdataset
FROM table1 INNER JOIN
     table2
     ON table1.keys  =table2.ID
WHERE table2.filter = "Value"
GROUP BY category
ORDER BY SUM(score) DESC);

соответственно

SELECT category, MAX(counted)
FROM (
SELECT count(*) AS counted, category
INTO newdataset
FROM table1 INNER JOIN
     table2
     ON table1.keys  =table2.ID
WHERE table2.filter = "Value"
GROUP BY category
ORDER BY count(*) DESC);

, что приводит к ошибке сообщение «Запрос действия не может быть использован в качестве источника строки».

Второй способ, который я пробовал:

SELECT TOP 1 * 
 FROM (
    SELECT SUM(score) AS calcsum, category
    INTO newdataset
    FROM table1 INNER JOIN
         table2
         ON table1.keys  =table2.ID
    WHERE table2.filter = "Value"
    GROUP BY category
    ORDER BY SUM(score) DESC);

соответственно.

SELECT TOP 1 * 
 FROM (
    SELECT SUM(score) AS calcsum, category
    INTO newdataset
    FROM table1 INNER JOIN
         table2
         ON table1.keys  =table2.ID
    WHERE table2.filter = "Value"
    GROUP BY category
    ORDER BY SUM(score) DESC);

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

Обновление : я пробовал согласно ответам:

SELECT category, max(calcsum)
INTO newdataset
FROM (SELECT SUM(score) AS calcsum, category      
      FROM table1 INNER JOIN
           table2
           ON table1.keys = table2.ID
      WHERE table2.filter = "Value"
      GROUP BY category
     ) t;

Тем не менее, я получаю сообщение об ошибке (категория не является частью агрегатной функции, переведено)?

Я также пытался:

 SELECT t.category, max(calcsum)
    INTO newdataset
    FROM (SELECT SUM(score) AS calcsum, category      
          FROM table1 INNER JOIN
               table2
               ON table1.keys = table2.ID
          WHERE table2.filter = "Value"
          GROUP BY category
         ) t;

Но та же ошибка. Итак, как будет выглядеть рабочее решение, использующее max, а не top?

Когда я пытаюсь это сделать:

 SELECT category, calcsum
    INTO newdataset
    FROM (SELECT SUM(score) AS calcsum, category      
          FROM table1 INNER JOIN
               table2
               ON table1.keys = table2.ID
          WHERE table2.filter = "Value"
          GROUP BY category
         ) t;

Это работает, но когда я добавляю max (calcsum), я получаю ошибка (категория не является частью агрегатной функции, переводится)?

Ответы [ 4 ]

1 голос
/ 03 апреля 2020

Причина, по которой ваши версии не работают, заключается в том, что INTO разрешено только в наиболее удаленном запросе. Вы пытаетесь поместить его в подзапрос. Кроме того:

  • ORDER BY обычно не допускается в подзапросе.
  • Подзапросам в предложении FROM требуется псевдоним таблицы.

Таким образом, количество ошибок несколько.

Например, вы могли бы написать последний запрос как:

SELECT TOP (1) t.* 
INTO newdataset
FROM (SELECT SUM(score) AS calcsum, category      
      FROM table1 INNER JOIN
           table2
           ON table1.keys = table2.ID
      WHERE table2.filter = "Value"
      GROUP BY category
     ) t
ORDER BY SUM(score) DESC;

Как указывает GMB, вам не нужен подзапрос для этой логики c .

Я хотел бы отметить, что если у вас есть дубликаты для максимальных значений, то logi c выбирает произвольный максимум. Если вам нужны все из них, используйте TOP (1) WITH TIES.

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

1 голос
/ 03 апреля 2020

Если вам нужна только верхняя запись в наборе результатов, почему бы просто не ограничить возвращаемые строки во внешнем запросе?

SELECT TOP (1) SUM(score) AS calcsum, category
INTO newdataset
FROM table1 
INNER JOIN table2 ON table1.keys = table2.ID
WHERE table2.filter = "Value"
GROUP BY category
ORDER BY SUM(score) DESC;
0 голосов
/ 12 апреля 2020

Есть ли конкретная c цель использовать формат подзапроса, поскольку эти запросы также могут возвращать выходные данные без использования подзапросов. В любом случае вы отсортировали "калькуляцию" в порядке убывания. Предел должен сделать работу за вас.

SELECT SUM(score) AS calcsum, category
FROM table1 INNER JOIN
 table2
 ON table1.keys  =table2.ID
WHERE table2.filter = "Value"
GROUP BY category
ORDER BY calcsum DESC LIMIT 1
0 голосов
/ 07 апреля 2020

Честно говоря, я не понимаю причину, по которой вам требуется не использовать top / order-by, как предлагает GMB.

В любом случае, вот запрос с использованием функции MAX (). Пожалуйста, имейте в виду, что это дорогостоящий запрос.

SELECT SUM(score) AS calcsum, category 
INTO newdataset
FROM table1 
INNER JOIN table2 ON table1.keys = table2.id 
WHERE table2.filter = "Value" 
GROUP BY category 
HAVING SUM(score) = (
    SELECT MAX(sc) 
    FROM (
        SELECT SUM(score) AS sc
        FROM table1 
        INNER JOIN table2 ON table1.keys = table2.id 
        WHERE table2.filter = "Value" 
        GROUP BY category
      )
  )

И тот же принцип применяется к подсчету:

SELECT COUNT(*) AS counted, category 
INTO newdataset
FROM table1 
INNER JOIN table2 ON table1.keys = table2.id 
WHERE table2.filter = "Value" 
GROUP BY category 
HAVING COUNT(*) = (
    SELECT MAX(sc) 
    FROM (
        SELECT COUNT(*) AS sc
        FROM table1 
        INNER JOIN table2 ON table1.keys = table2.id 
        WHERE table2.filter = "Value" 
        GROUP BY category
      )
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...