In SQL, sometimes we need to find the average value of a column based on another column of the table such as finding the subject-wise average marks scored by the students of a class. This involves the use of the GROUP BY clause along with the AGGREGATE function like AVG. The same is depicted in the below article. For this, we use a specific kind of query shown in the below demonstration. For this article, we will be using the Microsoft SQL Server as our database.
Step 1: Create a Database. For this use the below command to create a database named GeeksForGeeks.
Query:
CREATE DATABASE GeeksForGeeks
Output:
Step 2: Use the GeeksForGeeks database. For this use the below command.
Query:
USE GeeksForGeeks
Output:
Step 3: Create a table of STDMARKS inside the database GeeksForGeeks. This table has 4 columns namely ROLL_NO, STUDENT_NAME, SUBJECT, and MARKS containing the roll number and name of the students and the subject name and marks scored by the student in the respective subject.
Query:
CREATE TABLE STDMARKS( ROLL_NO INT, STUDENT_NAME VARCHAR(10), SUBJECT VARCHAR(10), MARKS INT);
Output:
Step 4: Describe the structure of the table STDMARKS.
Query:
EXEC SP_COLUMNS STDMARKS;
Output:
Step 5: Insert 16 rows into the STDMARKS table.
Query:
INSERT INTO STDMARKS VALUES(1,'RAVI','C++',75); INSERT INTO STDMARKS VALUES(1,'RAVI','ORACLE',84); INSERT INTO STDMARKS VALUES(1,'RAVI','JAVA',95); INSERT INTO STDMARKS VALUES(1,'RAVI','OS',62); INSERT INTO STDMARKS VALUES(2,'VIVEK','C++',46); INSERT INTO STDMARKS VALUES(2,'VIVEK','ORACLE',70); INSERT INTO STDMARKS VALUES(2,'VIVEK','JAVA',55); INSERT INTO STDMARKS VALUES(2,'VIVEK','OS',56); INSERT INTO STDMARKS VALUES(3,'RAJ','C++',82); INSERT INTO STDMARKS VALUES(3,'RAJ','ORACLE',84); INSERT INTO STDMARKS VALUES(3,'RAJ','JAVA',74); INSERT INTO STDMARKS VALUES(3,'RAJ','OS',92); INSERT INTO STDMARKS VALUES(4,'MAHESH','C++',43); INSERT INTO STDMARKS VALUES(4,'MAHESH','ORACLE',49); INSERT INTO STDMARKS VALUES(4,'MAHESH','JAVA',68); INSERT INTO STDMARKS VALUES(4,'MAHESH','OS',35);
Output:
Step 6: Display all the rows of the STDMARKS table.
Query:
SELECT * FROM STDMARKS;
Output:
Step 7: Display the SUBJECT and the average marks scored by the students in that subject from the table STDMARKS. For achieving the aggregate value of a column according to another column, we need to use the GROUP BY clause along with the aggregate function such as AVG. The column mentioned after the GROUP BY clause is the basis for our output. The subject-wise average marks are achieved in this manner.
Syntax:
SELECT COLUMN_NAME1,AVG(COLUMN_NAME2) AS ALIAS FROM TABLE_NAME GROUP BY COLUMN_NAME1;
Query:
SELECT SUBJECT,AVG(MARKS) AS "AVERAGE MARKS" FROM STDMARKS GROUP BY SUBJECT;
Output:
Last Updated :
28 Nov, 2021
Like Article
Save Article
to continue to Google Sites
Not your computer? Use Guest mode to sign in privately. Learn more
12.3. Использование языка SQL для выбора информации из таблицы
Выборка данных осуществляется с помощью оператора SELECT, который является самым часто используемым оператором языка SQL. Синтаксис оператора SELECT имеет следующий вид:
SELECT [ALL/DISTINCT] <список атрибутов>/* FROM <список таблиц> [WHERE <условие выборки>] [ORDER BY <список атрибутов>] [GROUP BY <список атрибутов>] [HAVING <условие>] [UNION<выражение с оператором SELECT>]
В квадратных скобках указываются элементы, которые могут в запросе отсутствовать.
Ключевое слово ALL означает, что результатом будут все строки, удовлетворяющие условию запроса, в том числе и одинаковые строки. DISTINCT означает, что в результирующий набор не включаются одинаковые строки. Далее идет список атрибутов исходной таблицы, которые будут включены в таблицу-результат. Символ * означает, что в таблицу-результат включаются все атрибуты исходной таблицы.
Обязательным ключевым словом является слово FROM, за ним следуют имена таблиц, к которым осуществляется запрос.
В предложении с ключевым словом WHERE задаются условия выборки строк таблицы. В таблицу-результат включаются только те строки, для которых условие, указанное в предложении WHERE, принимает значение истина.
Ключевое слово ORDER BY задает операцию упорядочения строк таблицы-результата по указанному списку атрибутов.
В предложении с ключевым словом GROUP BY задается список атрибутов группировки (разъяснение этого и последующего ключевого слова будет представлено немного позднее).
В предложении HAVING задаются условия, накладываемые на каждую группу.
Отдельно отметим, что ключевые слова FROM, WHERE, ORDER BY используются аналогичным образом и в других операторах манипулирования данными языка SQL.
Рассмотрим реализацию запросов для конкретного примера, представленного в
«Использование формального аппарата для оптимизации схем отношений»
(см.
рис.
8.1)
Выдать список всех студентов.
или
SELECT id_st, surname FROM student
Заметим, что если добавить к данному запросу предложение ORDER BY surname, то список будет упорядочен по фамилии. По умолчанию подразумевается, что сортировка производится по возрастанию. Если необходимо упорядочение по убыванию, после имени атрибута добавляется слово DESC.
Выдать список оценок, которые получил студент с кодом «1».
SELECT id_st, mark FROM mark_st WHERE id_st = 1
Выдать список кодов студентов, которые получили на экзаменах хотя бы одну двойку или тройку.
В предложении WHERE можно записывать выражение с использованием арифметических операторов сравнения (<, >, и т.д.) и логических операторов ( AND, OR, NOT ) как и в обычных языках программирования.
SELECT id_st, mark FROM mark_st WHERE ( MARK >= 2 ) AND ( MARK <= 3 )
Наряду с операторами сравнения и логическими операторами для составления условий в языке SQL (из-за специфики области применения) существуют ряд специальных операторов, которые, как правило, не имеют аналогов в других языках. Вот эти операторы:
- IN – вхождение в некоторое множество значений;
- BETWEEN – вхождение в некоторый диапазон значений;
- LIKE – проверка на совпадение с образцом;
- IS NULL – проверка на неопределенное значение.
Оператор IN используется для проверки вхождения в некоторое множество значений. Так, запрос
SELECT id_st, mark FROM mark_st WHERE mark IN (2,3)
дает тот же результат, что и вышеуказанный запрос (выведет идентификаторы всех абитуриентов, получивших хотя бы одну двойку или тройку на экзаменах).
Того же результата можно добиться, используя оператор BETWEEN:
SELECT id_st, mark FROM mark_st WHERE mark BETWEEN 2 AND 3
Выдать список всех студентов, фамилии которых начинаются с буквы А.
В этом случае удобно использовать оператор LIKE.
Оператор LIKE применим исключительно к символьным полям и позволяет устанавливать, соответствует ли значение поля образцу. Образец может содержать специальные символы:
_ (символ подчеркивания) – замещает любой одиночный символ;
% (знак процента) – замещает последовательность любого числа символов.
SELECT id_st, surname FROM student WHERE surname LIKE 'А%'
Очень часто возникает необходимость произвести вычисление минимальных, максимальных или средних значений в столбцах. Так, например, может понадобиться вычислить средний балл. Для осуществления подобных вычислений SQL предоставляет специальные агрегатные функции:
- MIN – минимальное значение в столбце;
- MAX – максимальное значение в столбце;
- SUM – сумма значений в столбце;
- AVG – среднее значение в столбце;
- COUNT – количество значений в столбце, отличных от NULL.
Следующий запрос считает среднее среди всех баллов, полученных студентами на экзаменах.
SELECT AVG(mark) FROM mark_st
Естественно, можно использовать агрегатные функции совместно с предложением WHERE:
SELECT AVG(mark) FROM mark_st WHERE id_st = 100
Данный запрос вычислит средний балл студента с кодом 100 по результатам всех сданных им экзаменов.
SELECT AVG(mark) FROM mark_st WHERE id_ex = 10
Данный запрос вычислит средний балл студентов по результатам сдачи экзамена с кодом 10.В дополнение к рассмотренным механизмам язык SQL предоставляет мощный аппарат для вычисления агрегатных функций не для всей таблицы результатов запроса, а для разных значений по группам. Для этого в SQL существует специальная конструкция GROUP BY, предназначенная для указания того столбца, по значениям которого будет производиться группировка. Так, например, мы можем вычислить средний балл по всем экзаменам для каждого студента. Для этого достаточно выполнить следующий запрос:
SELECT id_st, AVG(mark) FROM mark_st GROUP BY id_st
Все это, как обычно, может быть совмещено с предложением WHERE. При этом, не вдаваясь в тонкости выполнения запроса внутри СУБД, можно считать, что сначала выполняется выборка тех строк таблицы, которые удовлетворяют условиям из предложения WHERE, а потом производится группировка и агрегирование.
Приведем запрос, который вычисляет средний балл по оценкам, полученным на экзамене с кодом 100, для каждого студента.
SELECT id_st, AVG(mark) FROM mark_st WHERE id_ex = 100 GROUP BY id_st
Заметим, что группировка может производиться более чем по одному полю.
Для запросов, содержащих секцию GROUP BY существует важное ограничение: такие запросы могут включать в качестве результата столбцы, по которым производится группировка, и столбцы, которые содержат собственно результаты агрегирования.
Для того чтобы форматировать вывод, существуют различные возможности SQL. Так, например, допустимым является включение текста в запрос. Рассмотрим пример того, как это делается:
SELECT 'Средний балл=', AVG(mark) FROM mark_st WHERE id_ex = 10
В результате данного запроса пользователь увидит не просто некоторое число, а число, сопровожденное поясняющим текстом.
% (знак процента) |
– замещает последовательность любого |
числа символов. |
Так, например, следующий запрос покажет данные всех абитуриентов, фамилии которых начинаются с буквы «А».
SELECT |
name, second_name, surname |
FROM |
entrant |
WHERE |
name LIKE ‘А%’ |
Оператор IS NULL позволяет обнаруживать в таблицы неопределенные значения (напомним, что подобные значения называются
NULL).
Так, например, следующий запрос покажет всех абитуриентов, которые не указали место своего рождения:
SELECT |
name, second_name, surname |
FROM |
entrant |
WHERE |
birth_place IS NULL |
Использование агрегатных функций. Простые запросы
Очень часто возникает необходимость произвести вычисление минимальных, максимальных или средних значений в столбцах. Так, например, Вам может понадобиться вычислить средний балл или что-то другое. Для осуществления подобных вычислений в языке программирования высокого уровня Вы бы предприняли некоторые действия, в частности организовали бы цикл, сосчитали сумму, потом разделили бы ее на количество слагаемых в сумме, получив значение среднего балла. SQL избавляет Вас от необходимости программирования всей последовательности подобных действий. Для этого SQL предоставляет Вам специальные агрегатные функции:
MIN |
– минимальное значение в столбце; |
|
MAX |
– максимальное значение в столбце; |
|
SUM |
– сумма значений в столбце; |
|
AVG |
– |
среднее значение в столбце; |
COUNT |
– |
количество значений в столбце, отличных от NULL. |
Так, следующие запросы считают, соответственно, минимум, максимум, сумму, среднее среди всех баллов, полученными студентами на экзаменах. Количество оценок считает последний запрос.
166
SELECT |
MIN(mark) |
FROM |
mark |
SELECT |
MAX(mark) |
FROM |
mark |
SELECT |
SUM(mark) |
FROM |
mark |
SELECT |
AVG(mark) |
FROM |
mark |
SELECT |
COUNT(mark) |
FROM |
mark |
Заметим, что, изменив следующим образом текст последнего запроса, мы получим количество разных оценок, полученных на экзаменах:
SELECT COUNT(DISTINCT mark)
FROM mark
Использование агрегатных функций. Комбинирование с предложением WHERE
Дополнительно к описанным выше простым случаям, Вы можете использовать агрегатные функции совместно с предложением
WHERE:
SELECT |
AVG(mark) |
FROM |
mark |
WHERE |
entrant_id = 100 |
Данный запрос вычислит средний балл студента с кодом 100 по результатам всех сданных им экзаменов.
SELECT |
AVG(mark) |
FROM |
mark |
WHERE |
exam_id = 10 |
Данный запрос вычислит средний балл студентов по результатам сдачи экзамена с кодом 10.
Нетрудно видеть, что агрегатные функции, в сочетании с ограничением области данных при помощи предложения WHERE, представляют собой мощный аппарат, позволяющий ответить на многие реально возникающие вопросы путем применения SQL-запросов.
167
Использование агрегатных функций и группировка. Предложение GROUP BY
В дополнение к рассмотренным механизмам язык SQL предоставляет мощный аппарат для вычисления агрегатных функций не для всей таблицы результатов запроса, а для разных значений по группам.
Для этого в SQL существует специальная конструкция GROUP BY, предназначенная для указания того столбца, по значениям которого будет производиться группировка.
Так, например, мы можем вычислить средний балл по всем экзаменам для каждого студента. Для этого достаточно выполнить следующий запрос:
SELECT |
entrant_id, AVG(mark) |
FROM |
mark |
GROUP BY |
entrant_id |
Все это, как обычно, может быть совмещено с предложением WHERE. При этом, не вдаваясь в тонкости выполнения запроса внутри СУБД, Вы можете считать, что сначала выполняется выборка тех строк таблицы, которые удовлетворяют условиям из предложения WHERE, а потом производится группировка и агрегирование.
Приведем запрос, который вычисляет средний балл по оценкам, полученным на экзамене с кодом 100, для каждого студента. Для этого достаточно выполнить следующий запрос:
SELECT |
entrant_id, AVG(mark) |
FROM |
mark |
WHERE |
exam_id = 100 |
GROUP BY |
entrant_id |
Заметим, что группировка может производиться более, чем по одному полю. Так, вы можете вычислить средний балл, введя дополнительное разграничение по дням, в которые вносилась информация в базу (считая, например, что эта дата совпадает с датой проведения экзамена):
SELECT |
entrant_id, mod_date, AVG(mark) |
FROM |
mark |
WHERE |
exam_id = 100 |
GROUP BY |
entrant_id, mod_date |
168
Для запросов, содержащих секцию GROUP BY существует важное ограничение: такие запросы могут включать в качестве результата столбцы, по которым производится группировка, и столбцы, которые содержат собственно результаты агрегирования.
Использование агрегатных функций и группировка. Ограничение результатов запроса. Предложение HAVING
В языке SQL присутствуют средства, которые позволяют Вам сделать следующее: допустим, Вы хотите получить в качестве результатов запроса данные только тех абитуриентов, средний балл которых превышает 4. Как это сделать? Проблема в том, что стандарт языка не допускает использование агрегатных функций в предложении WHERE. Получается, что сначала необходимо выполнить запрос и сосчитать среднее, а потом ограничить результат по условию «Среднее > 4». Для осуществления подобных действий стандартом языка предусмотрена специальная секция HAVING. Так, запрос может выглядеть следующим образом:
SELECT |
entrant_id, mod_date, AVG(mark) |
FROM |
mark |
WHERE |
exam_id = 100 |
GROUP BY |
entrant_id, mod_date |
HAVING |
AVG(mark) > 4 |
Форматирование вывода. Выражения в запросе. Упорядочение
Для того, чтобы форматировать вывод, Вы можете использовать различные возможности SQL. Так, например, допустимым является включение текста в запрос. Рассмотрим пример того, как это делается:
SELECT |
‘Средний балл=’, AVG(mark) |
FROM |
mark |
WHERE |
exam_id = 10 |
В результате данного запроса Вы увидите не просто некоторое число, а число, сопровожденное поясняющим текстом.
Наряду с обычной выборкой значений из столбцов таблицы, имеется возможность вносить изменения в эти значения путем вычисления выражений.
Так, например, Вы можете перейти от 5-балльной к 10-балльной системе, преобразовав значение среднего балла следующим образом:
169
SELECT |
‘Средний балл=’, AVG(mark)*2 |
FROM |
mark |
WHERE |
exam_id = 10 |
Следующий важный момент связан с осуществлением сортировки (упорядочения) данных. Для организации сортировок в стандарте SQL предусмотрена специальная секция ORDER BY. В этой секции Вам необходимо указать, по какому столбцу (по каким столбцам) упорядочивать результаты запроса. При этом, при использовании нескольких столбцов упорядочение будет производится последовательно (по первому критерию, если значения совпали – по второму критерию и т.д.).
Следующий запрос распечатывает список абитуриентов, в котором фамилии следуют в алфавитном порядке.
SELECT |
name, second_name, surname |
FROM |
entrant |
ORDER BY |
name |
По умолчанию подразумевается, что сортировка производится по возрастанию. Если Вам необходимо упорядочивать по убыванию, необходимо использовать указание «DESC».
SELECT |
name, second_name, surname |
FROM |
entrant |
ORDER BY |
name DESC |
Для упорядочения по возрастанию присутствует указание «ASC», но его обычно не пишут явным образом.
При упорядочении по нескольким столбцам Вы можете упорядочивать как по возрастанию, так и по убыванию, указывая соответствующую конструкцию после наименования каждого столбца.
SELECT |
name, second_name, surname |
FROM |
entrant |
ORDER BY |
name DESC, second_name ASC |
Наряду с упорядочиванием в обычных запросах, стандарт SQL позволяет сортировать и запросы, содержащие агрегирование. В этом случае порядок следования секций следующий:
SELECT |
entrant_id, mod_date, AVG(mark) |
FROM |
mark |
WHERE |
exam_id = 100 |
170
GROUP BY entrant_id, mod_date
HAVING AVG(mark) > 4
ORDER BY entrant_id
6.4.2.Использование SQL для выбора информации из нескольких таблиц
До сих пор мы рассматривали ту часть SQL, которая касалась выбора информации из единственной таблицы. Естественно, возможности языка этим не ограничиваются. Так, Вы можете запрашивать информацию из нескольких таблиц, реализуя описанные в соответствующем разделе учебника реляционные операции. Рассмотрим некоторые примеры того, как это делается. Стоит упомянуть, что полное рассмотрение этой темы выходит за рамки данного учебника. Подробно этот вопрос можно изучить при помощи, например, [6, 8]. Мы рассмотрим некоторые несложные случаи, часто встречающиеся на практике, в которых присутствует необходимость выбора информации из нескольких таблиц сразу.
Как правило, в тех случаях, когда возникает необходимость выбирать информацию из разных таблиц, они тем или иным образом связаны друг с другом, например, отношениями один ко многим или один к одному по некоторому полю.
171
Рис. 49. Пример связанных таблиц
В примере (рис. 48) тоже присутствуют такие таблицы. Рассмот-
рим таблицы entrant, mark и exam.
Таблица mark (оценки) связана с таблицей exam (экзамены) по по-
лям id–entrant_id.
Таблица mark (оценки) связана с таблицей entrant (абитуриенты)
по полям id– exam_id.
Допустим нам требуется распечатать список абитуриентов с оценками, которые они получили на экзаменах. Для этого необходимо выполнить следующий запрос:
SELECT |
entrant.name, mark.exam_id, mark.mark |
FROM |
entrant, mark |
WHERE |
entrant.id = mark.entrant_id |
Заметим, следующие изменения по сравнению с теми запросами, которые мы писали ранее:
1.В секции FROM указаны 2 таблицы.
2.Так таблиц стало больше одной, появилась некоторая неоднозначность при упоминании полей. Так, во многих случаях неизвестно, из какой таблицы из списка FROM брать поле. Для устранения неоднозначности имена полей указываются с префиксом – именем таблицы. Имя таблицы от имени поля отделяется точкой.
3.В предложении WHERE указано условие соединения таблиц.
Предположим, нас не удовлетворяет тот факт, что мы видим код предмета, но не видим дату сдачи экзамена. Для того, чтобы решить эту проблему необходимо выполнить следующий запрос:
SELECT |
entrant.name, exam.exam_date, mark.exam_id, |
|
FROM |
mark.mark |
|
entrant, |
mark, exam |
|
WHERE |
(entrant.id = mark.entrant_id) AND |
|
(exam.id |
= mark.exam_id) |
Нетрудно заметить, что использование префиксов-имен таблиц сильно загромождает запрос. Для того, чтобы избежать подобного загромождения, используются псевдонимы. Так, мы можем переписать предыдущий запрос следующим образом:
172
SELECT |
E.name, X.exam_date, M.exam_id, M.mark |
||
FROM |
entrant E, mark M, exam X |
||
WHERE |
(E.id |
= |
M.entrant_id) AND |
(E.id |
= |
M.exam_id) |
6.4.3.Использование SQL для вставки, редактирования и удаления данных в таблицах
Для добавления данных в таблицу в стандарте SQL предусмотрена команда INSERT. Синтаксис команды проще всего понять из следующего запроса:
INSERT INTO mark
VALUES (1, 2, 5, ’01.08.2003’, 11)
Данный запрос вставляет в таблицу mark строку, содержащую значения, перечисленные в списке VALUES.
Если Вы не хотите указывать значение какого-то поля, Вы можете присвоить ему NULL:
INSERT INTO mark
VALUES (1, 2, 5, ’01.08.2003’, NULL)
В случае, если Вы считаете необходимым использование для некоторых полей значений по умолчанию, SQL позволяет явно указать, какие поля необходимо заполнить Вашими данными, а какие – значениями по умолчанию.
INSERT INTO mark (entrant_id, exam_id, mark) VALUES (1, 2, 5)
Кроме явного указания значений, Вы также можете вставить в таблицу данные, представляющие собой результат выполнения другого запроса. Так, пусть у Вас есть вспомогательная таблица entrant_temp с
полями id, name.
INSERT INTO entrant_temp (name)
SELECT |
E.name |
FROM |
entrant E |
ORDER BY |
E.name |
Для удаления данных из таблицы существует команда DELETE.
DELETE
173
Соседние файлы в папке лабы
- #
26.04.20151.32 Mб168DB.mdb
- #
- #
- #
- #
- #
- #
У меня есть такая таблица:
[challenge_log]
User_id | challenge | Try | Points
==============================================
1 1 1 5
1 1 2 8
1 1 3 10
1 2 1 5
1 2 2 8
2 1 1 5
2 2 1 8
2 2 2 10
Я хочу общий средний балл. Для этого мне нужно 3 шага:
Шаг 1 — Получить МАКСИМАЛЬНОЕ значение (баллов) каждого пользователя в каждом вызове:
User_id | challenge | Points
===================================
1 1 10
1 2 8
2 1 5
2 2 10
Шаг 2 — СУММА всех МАКСИМАЛЬНЫХ значений одного пользователя
User_id | Points
===================
1 18
2 15
Шаг 3 — Средний
AVG = SUM (Points from step 2) / number of users = 16.5
Можете ли вы помочь мне найти запрос для этого?
2014-08-21 18:01
4
ответа
Решение
Вы можете получить общее среднее значение, разделив общее количество баллов на количество отдельных пользователей. Тем не менее, вам нужно максимум на вызов, поэтому сумма немного сложнее. Один из способов заключается в подзапросе:
select sum(Points) / count(distinct userid)
from (select userid, challenge, max(Points) as Points
from challenge_log
group by userid, challenge
) cl;
Вы также можете сделать это с одним уровнем агрегации, найдя максимум в where
пункт:
select sum(Points) / count(distinct userid)
from challenge_log cl
where not exists (select 1
from challenge_log cl2
where cl2.userid = cl.userid and
cl2.challenge = cl.challenge and
cl2.points > cl.points
);
2014-08-21 18:07
Попробуйте это для размера.
-
Общее среднее
select avg( Points ) as mean_score from challenge_log
-
Среднее за вызов
select challenge , avg( Points ) as mean_score from challenge_log group by challenge
Если вы хотите вычислить среднее значение каждого пользователя, набравшего наибольшее количество баллов за вызов, вы не очень сильно повышаете уровень сложности:
-
Общее среднее
select avg( high_score ) from ( select user_id , challenge , max( Points ) as high_score from challenge_log ) t
-
Среднее за вызов
select challenge , avg( high_score ) from ( select user_id , challenge , max( Points ) as high_score from challenge_log ) t group by challenge
2014-08-21 18:25
После шага 1 сделать
SELECT USER_ID, AVG(POINTS)
FROM STEP1
GROUP BY USER_ID
2014-08-21 18:10
Вы можете объединить шаги 1 и 2 в один запрос / подзапрос следующим образом:
Select BestShot.[User_ID], AVG(cast (BestShot.MostPoints as money))
from (select tLog.Challenge, tLog.[User_ID], MostPoints = max(tLog.points)
from dbo.tmp_Challenge_Log tLog
Group by tLog.User_ID, tLog.Challenge
) BestShot
Group by BestShot.User_ID
Подзапрос определяет наибольшее количество баллов для каждой комбинации пользователь / вызов, а внешний запрос принимает эти максимальные значения и использует функцию AVG для получения их среднего значения. Последнее Group By указывает SQL усреднить все значения по каждому идентификатору пользователя.
2014-08-21 18:42