Левое соединение с той же таблицей и группой возвращает повторяющиеся кортежи в обратном порядке - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь запросить базу данных (не принадлежащую мне), которая содержит следующие столбцы:

NumEpoca (epoch), Turma(class), Dia (day - indicates day of the week), 
Hora (hour - each value indicates a 30mins time, a 3h class generate 6 tuples), 
Disciplina (course), TipoAula (type of class, theoretical or practical),     
Sala (classroom)

Это в основном расписание занятий, поэтому для данного класса в тот же день неделю, когда я могу провести в одну неделю практические занятия, а в другую - теоретические.

Теперь я хочу получить для данного дня минимальный и максимальный час (чтобы я мог рассчитать начальный и конечный час). час занятий), но я также хочу получить для них классы, и я не знаю априори, будет ли это теоретический или практический урок.

Кроме того, некоторые занятия являются только практическими , а некоторые являются чисто теоретическими, поэтому мне нужен только 1 класс.

Запрос, который я выполняю, дает мне практически все, но

LectureDetails(beginDate=2020-05-26 15:30:00, endDate=2020-05-26 18:30:00, classroom=L_H1/G.0.08)
LectureDetails(beginDate=2020-05-26 15:30:00, endDate=2020-05-26 18:30:00, classroom=G.0.08/L_H1)

, как вы можете видеть здесь, я получаю тот же класс (который начинается и заканчивается в один и тот же час, для двух классов Teo и Pract. Но мне нужен только 1 кортеж на этот день, и я получаю L_H1 / G.0.08 и G.0.08 / L_H1.

"SELECT a1.Dia,MIN(a1.Hora),MAX(a1.Hora),a1.Sala, a2.Sala FROM Aulas as a1 LEFT JOIN Aulas as a2 " +
                    "on a1.Sala <> a2.Sala and a1.Disciplina = a2.Disciplina and a1.NumEpoca = a2.NumEpoca and a1.Turma = a2.Turma " +
                    "and a1.Dia= a2.Dia and a1.Hora = a2.Hora " +
                    "where NumEpoca = ? AND Turma = ? AND Disciplina=?  GROUP BY a1.Dia,a1.Sala,a2.Sala"

Заранее спасибо.

1 Ответ

1 голос
/ 26 мая 2020

Вы могли бы исключить неверно упорядоченные результаты, используя a1.Sala < a2.Sala вместо неравенства.

Но в любом случае это не тот подход, который вам нужен. Попробуйте что-то вроде этого:

SELECT Dia, MIN(Hora), MAX(Hora),
    MIN(Sala),
    CASE WHEN MIN(Sala) = MAX(Sala) THEN NULL ELSE MAX(Sala) END
FROM Aulas
WHERE NumEpoca = ? AND Turma = ? AND Disciplina = ?
GROUP BY Dia
...