запрос, чтобы получить топ-10 значений за каждый месяц и год (Ms access) - PullRequest
0 голосов
/ 09 июля 2019

У меня следующая структура базы данных (данные ненастоящие)

+------------+-------+-------------+
|   Datum    | Dauer | description |
+------------+-------+-------------+
| 11.01.2018 | 02:30 | Test        |
| 11.02.2018 | 01:30 | Test        |
| 11.02.2018 | 00:30 | Test        |
| 11.03.2018 | 01:30 | Test        |
| 11.03.2018 | 03:30 | Test        |
| 11.03.2018 | 02:30 | Test        |
| 11.04.2018 | 00:30 | Test        |
| 11.04.2018 | 00:30 | Test        |
| 11.05.2018 | 01:30 | Test        |
| 11.05.2018 | 01:00 | Test        |
| 11.05.2018 | 01:30 | Test        |
| 11.06.2018 | 00:30 | Test        |
| 11.06.2018 | 00:30 | Test        |
| 11.06.2018 | 02:30 | Test        |
| 11.06.2018 | 01:30 | Test        |
| 11.07.2018 | 01:30 | Test        |
| 11.07.2018 | 00:30 | Test        |
| 11.07.2018 | 03:30 | Test        |
| 11.08.2018 | 05:30 | Test        |
| 11.08.2018 | 00:30 | Test        |
| 11.08.2018 | 00:30 | Test        |
| 11.08.2018 | 01:30 | Test        |
| 11.08.2018 | 02:30 | Test        |
| 11.08.2018 | 00:30 | Test        |
| 11.09.2018 | 01:30 | Test        |
| 11.09.2018 | 02:30 | Test        |
| 11.09.2018 | 01:30 | Test        |
+------------+-------+-------------+

Я хотел бы создать запрос для получения 10 лучших значений каждого месяца и порядка по месяцам и времени.

Я пробовал следующий запрос

SELECT Top 10 *
FROM History_query where Month(Datum)=1 and Dauer >= #01:00# order by  Dauer desc 
Union 
SELECT Top 10 *
FROM History_query where Month(Datum)=2 and Dauer >= #01:00# order by Dauer desc 

Дело в том, что я должен написать запрос на объединение в 12 раз за каждый месяц и за 2019 год одинаковым.

есть другой способ сделать его проще.

любая помощь очень ценится.

1 Ответ

0 голосов
/ 09 июля 2019

Вы можете использовать подзапрос:

SELECT *
FROM History_query 
WHERE Dauer IN
    (SELECT Top 10 Dauer
    FROM History_query As T
    WHERE Year(T.Datum) = Year(History_query.Datum)
        AND Month(T.Datum) = Month(History_query.Datum)
        AND T.Dauer >= #01:00#
    ORDER BY Dauer desc)

Редактировать :

Вы можете попробовать использовать вспомогательный запрос:

SELECT 
    Year([Datum]) * 100 + Month([Datum]) As YearMonth, 
    Dauer
FROM 
    History_query 
WHERE
    Dauer >= #01:00#

Сохранитьэто как YMHistory .Затем используйте это в последнем запросе:

SELECT *
FROM YMHistory
WHERE Dauer IN
    (SELECT Top 10 Dauer
    FROM YMHistory As T
    WHERE T.YearMonth = YMHistory.YearMonth
    ORDER BY Dauer desc)
...