Как «добавить» столбец к результату запроса, когда запрос содержит статистическую функцию? - PullRequest
5 голосов
/ 26 июля 2010

У меня есть таблица с названием «Посещаемость», которая используется для записи времени посещаемости студентов на курсах. Эта таблица имеет 4 столбца, скажем, «id», «course_id», «Participance_time» и «student_name». Пример нескольких записей в этой таблице:

23 100 01.01.2010 10:00:00 Том

24 100 01.01.2010 10:20:00 Боб

25 187 1/2/2010 08:01:01 Лиза

.....

Я хочу создать сводку по последнему времени посещения каждого курса. Я создал запрос ниже:

SELECT course_id, max(attendance_time) FROM attendance GROUP BY course_id

Результат будет примерно таким

100 01.01.2010 10: 20: 00

187 1/2/2010 08: 01: 01

Теперь все, что я хочу сделать, это добавить столбец id к приведенному выше результату. Как это сделать?

Я не могу просто изменить команду на что-то вроде этого

SELECT id, course_id, max(attendance_time) FROM attendance GROUP BY id, course_id

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

Ответы [ 3 ]

6 голосов
/ 26 июля 2010

Это типичный запрос «наибольший на группу», «наибольший n на группу» или «максимальный размер группы», который возникает при переполнении стека почти каждый день.Вы можете выполнить поиск по переполнению стека по этим терминам, чтобы найти много разных примеров того, как решить эту проблему с различными базами данных.Один из способов ее решения заключается в следующем:

SELECT
    T2.course_id,
    T2.attendance_time
    T2.id
FROM (
    SELECT
        course_id,
        MAX(attendance_time) AS attendance_time
    FROM attendance
    GROUP BY course_id
) T1
JOIN attendance T2
ON T1.course_id = T2.course_id
AND T1.attendance_time = T2.attendance_time

Обратите внимание, что теоретически этот запрос может возвращать несколько строк на course_id, если имеется несколько строк с одним и тем же посещаемостью.Если этого не произойдет, вам не нужно беспокоиться об этой проблеме.Если это потенциальная проблема, то вы можете решить ее, добавив дополнительную группировку по Course_id, Participance_time и выбрав минимальный или максимальный идентификатор.

0 голосов
/ 23 августа 2018

Начиная с SQL Server 2008, я хотел бы использовать общее табличное выражение для добавления агрегированных столбцов к запросам:

WITH AttendanceTimes (course_id, maxTime)
AS 
(
    SELECT
        course_id,
        MAX(attendance_time)
    FROM attendance
    GROUP BY course_id
)

SELECT
    a.course_id,
    t.maxTime,
    a.id
FROM attendance a
INNER JOIN AttendanceTimes t
ON a.course_id = t.course_id
0 голосов
/ 26 июля 2010

Зачем вам нужен дополнительный столбец? У него уже есть идентификатор курса, который идентифицирует данные. Синтетический идентификатор запроса будет бесполезным, поскольку он ни на что не ссылается. Если вы хотите получить максимум из результатов запроса для одного курса, вы можете добавить условие where, например:

SELECT course_id, max(attendance_time) FROM attendance GROUP BY course_id **WHERE course_id = your_id_here**;

Если вы имеете в виду, что столбец должен иметь имя 'id', вы можете указать его псевдоним в запросе:

SELECT course_id **AS id**, max(attendance_time) FROM attendance GROUP BY course_id;

Вы можете сделать запрос из своего представления, чтобы легко получить доступ к сводным данным:

CREATE VIEW max_course_times AS SELECT course_id AS id, max(attendance_time) FROM attendance GROUP BY course_id;

SELECT * FROM max_course_times;

...