Как найти разницу между последовательными строками одной группы? - PullRequest
0 голосов
/ 07 февраля 2020

Этот вопрос был задан в интервью Facebook:

(1) Есть две таблицы

  • посещаемость: дата | student_id | посещаемость
  • студентов: student_id | школьный идентификатор | класс_уровень | date_of_birth | родной город

Используя эти данные, не могли бы вы ответить на следующие вопросы:

  • В каком классе было наибольшее падение посещаемости между вчера и сегодня?

Пока у меня есть это, и я застрял. Вы можете помочь мне? Спасибо.

(SELECT grade_level, date, COUNT(attendance) AS att FROM attendances AS A
     LEFT JOIN students AS S
     ON A.student_id = S.student_id
     GROUP BY grade_level, date
     HAVING attendance == "yes"
     AND (date == "02-06-2020" OR date == "02-05-2020")
     ORDER BY grade_level, date DESC) AS t

Ответы [ 2 ]

2 голосов
/ 07 февраля 2020

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

select
    s.grade_level
    sum(a.attendance * case when a.date = date('now') then 1 else -1 end) attendance_drop
from attendances a
inner join students s on s.student_id = a.student_id
where a.date in (date('now'), date('now', '-1 day'))
group by s.grade_level
order by attendance_drop desc
limit 1
1 голос
/ 07 февраля 2020

Пожалуйста, попробуйте с приведенным ниже сценарием думать, что он работает нормально.

SELECT TOP 1 s.grade_level, COUNT(a.attendance) AS dropCount 
FROM students  AS s
INNER JOIN attendances AS a ON  a.student_id = s.student_id
WHERE 
    a.attendance = 'no'
    AND (a.date <= DATEADD(DAY,-1, CAST(GETDATE() AS DATE)) AND a.date >= CAST(GETDATE() AS DATE))
GROUP BY s.grade_level
ORDER BY dropCount DESC
...