У меня есть запрос, который возвращает такие значения:
Как видите, я получаю несколько результатов с одинаковым значением SeminarId. Я хочу получить результат с наименьшим значением даты "Anreise" и вернуть один результат с самой ранней датой.
Я попытался использовать MIN(), но я получаю статистическую ошибку функции, и у меня нет других идей.
SELECT * FROM
(
SELECT TuId as TeiluberId, TU_Sem_ID AS SeminarId, TU_HotAnreiseDatum AS Anreise, TU_HotAbreiseDatum AS Abreise
,sem.Sem_von,sem.Sem_bis
FROM [WinClient].[TeilnehmerVerpflegungSeminar] tns
LEFT JOIN acc_seminar.t_Teiluber ON TuId = TU_ID
JOIN acc_seminar.t_Seminar sem ON sem_id = TU_Sem_ID
WHERE CONVERT(date,tns.Datum) < CONVERT(date, sem_von)
GROUP BY TuId, TU_Name, TU_Vorname, VpId, TU_Typ, TU_Sto, tu_sem_id, TU_HotAnreiseDatum, TU_HotAbreiseDatum, sem.Sem_von, sem.Sem_bis
UNION ALL
SELECT TU_ID, TU_Sem_ID, TU_HotAnreiseDatum, ISNULL(TU_HotAbreiseDatum, CONVERT(date, sem_bis)) AS Abreise, Sem_von, Sem_bis
FROM acc_seminar.t_Teiluber
JOIN acc_seminar.t_Seminar ON sem_id = TU_Sem_ID
WHERE TU_ID NOT IN (SELECT tvs.TuId FROM [WinClient].[TeilnehmerVerpflegungSeminar] tvs) AND TU_HotAnz > 0
AND TU_HotAnreiseDatum IS NOT NULL AND (CONVERT(date, TU_HotAnreiseDatum) != CONVERT(date, sem_von) OR CONVERT(date, TU_HotAbreiseDatum) != CONVERT(date, sem_bis))
) tu
WHERE tu.SeminarId = @Sem_ID
Вы можете использовать row_number()
with cte as
(
SELECT *,row_number() over(partition by SeminarId order by Anreise) rn
FROM
(
SELECT TuId as TeiluberId, TU_Sem_ID AS SeminarId, TU_HotAnreiseDatum AS Anreise, TU_HotAbreiseDatum AS Abreise
,sem.Sem_von,sem.Sem_bis
FROM [WinClient].[TeilnehmerVerpflegungSeminar] tns
LEFT JOIN acc_seminar.t_Teiluber ON TuId = TU_ID
JOIN acc_seminar.t_Seminar sem ON sem_id = TU_Sem_ID
WHERE CONVERT(date,tns.Datum) < CONVERT(date, sem_von)
GROUP BY TuId, TU_Name, TU_Vorname, VpId, TU_Typ, TU_Sto, tu_sem_id, TU_HotAnreiseDatum, TU_HotAbreiseDatum, sem.Sem_von, sem.Sem_bis
UNION ALL
SELECT TU_ID, TU_Sem_ID, TU_HotAnreiseDatum, ISNULL(TU_HotAbreiseDatum, CONVERT(date, sem_bis)) AS Abreise, Sem_von, Sem_bis
FROM acc_seminar.t_Teiluber
JOIN acc_seminar.t_Seminar ON sem_id = TU_Sem_ID
WHERE TU_ID NOT IN (SELECT tvs.TuId FROM [WinClient].[TeilnehmerVerpflegungSeminar] tvs) AND TU_HotAnz > 0
AND TU_HotAnreiseDatum IS NOT NULL AND (CONVERT(date, TU_HotAnreiseDatum) != CONVERT(date, sem_von) OR CONVERT(date, TU_HotAbreiseDatum) != CONVERT(date, sem_bis))
) tu
WHERE tu.SeminarId = @Sem_ID
) select * from cte where rn=1
Вы можете использовать with
командой, как это:
;With wholeData AS
(
SELECT TuId as TeiluberId, TU_Sem_ID AS SeminarId, TU_HotAnreiseDatum AS Anreise, TU_HotAbreiseDatum AS Abreise
,sem.Sem_von,sem.Sem_bis
FROM [WinClient].[TeilnehmerVerpflegungSeminar] tns
LEFT JOIN acc_seminar.t_Teiluber ON TuId = TU_ID
JOIN acc_seminar.t_Seminar sem ON sem_id = TU_Sem_ID
WHERE CONVERT(date,tns.Datum) < CONVERT(date, sem_von)
GROUP BY TuId, TU_Name, TU_Vorname, VpId, TU_Typ, TU_Sto, tu_sem_id, TU_HotAnreiseDatum, TU_HotAbreiseDatum, sem.Sem_von, sem.Sem_bis
UNION ALL
SELECT TU_ID, TU_Sem_ID, TU_HotAnreiseDatum, ISNULL(TU_HotAbreiseDatum, CONVERT(date, sem_bis)) AS Abreise, Sem_von, Sem_bis
FROM acc_seminar.t_Teiluber
JOIN acc_seminar.t_Seminar ON sem_id = TU_Sem_ID
WHERE TU_ID NOT IN (SELECT tvs.TuId FROM [WinClient].[TeilnehmerVerpflegungSeminar] tvs) AND TU_HotAnz > 0
AND TU_HotAnreiseDatum IS NOT NULL AND (CONVERT(date, TU_HotAnreiseDatum) != CONVERT(date, sem_von) OR CONVERT(date, TU_HotAbreiseDatum) != CONVERT(date, sem_bis))
)
SELECT q1.* from wholeData q1
JOIN (select SeminarId, MIN(Anreise) from WholeData group by SeminarId) q2
ON q1.SeminarId = q2.SeminarId AND q1.Anreise = q2.Anreise
WHERE q1.SeminarId = @Sem_ID