Еще один сложный заказ с датами MS Access - PullRequest
0 голосов
/ 26 апреля 2018

Мне нужна помощь в создании запроса для сортировки столбца Час с 9 утра до 8 утра (на следующий день).

У меня есть объединение 2 запросов с отдельным порядком и параметрами диапазона дат и добавлено ранжирование для сортировки возвращаемых строк.Но кажется, что запрос возвращает строки с 9 по 23, а затем возвращает результаты с 0 по 8. неожиданный результат

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

SELECT StationCode, Month, Day, Year, Hour, Rainfall
FROM
(SELECT 1 AS rank, StationCode, Month, Day, Year, Hour, Rainfall, DateValue(CStr([Month] & '/' & [Day] & '/' & [Year])) AS [Date]
FROM table1
WHERE (((StationCode)=10) AND ((Hour)>=9) AND ((DateValue(CStr([Month] & '/' & [Day] & '/' & [Year]))) Between DateValue([month1] & '/' & [day1] & '/' & [year1]) And DateValue([month2] & '/' & [day2] & '/' & [year2])))
ORDER BY Month, Day, Year, Hour
UNION
SELECT 2 AS rank, StationCode, Month, Day, Year, Hour, Rainfall, DateValue(CStr([Month] & '/' & [Day] & '/' & [Year])) AS [Date]
FROM table1
WHERE (((StationCode)=10) AND ((Hour)<=8) AND ((DateValue(CStr([Month] & '/' & [Day] & '/' & [Year]))) Between DateValue([month1] & '/' & [day1] & '/' & [year1]) And DateValue([month2] & '/' & [day2] & '/' & [year2])))
ORDER BY Month, Day, Year, Hour) dt
ORDER BY rank, Month, Day, Year

Пример данных:

StationCode | Month | Day | Year | Hour | Rainfall
         10 |     1 |   1 | 2010 |    0 |       0 
         10 |     1 |   1 | 2010 |    1 |       0
         10 |     1 |   1 | 2010 |    2 |       0
         10 |     1 |   1 | 2010 |    3 |       0
         10 |     1 |   1 | 2010 |    4 |       0
         10 |     1 |   1 | 2010 |    5 |       0
         10 |     1 |   1 | 2010 |    6 |       0
         10 |     1 |   1 | 2010 |    7 |       0
         10 |     1 |   1 | 2010 |    8 |       0
         10 |     1 |   1 | 2010 |    9 |       0
         10 |     1 |   1 | 2010 |   10 |       0
         10 |     1 |   1 | 2010 |   11 |       0
         10 |     1 |   1 | 2010 |   12 |       0
         10 |     1 |   1 | 2010 |   13 |       0
         10 |     1 |   1 | 2010 |   14 |       0
         10 |     1 |   1 | 2010 |   15 |       0
         10 |     1 |   1 | 2010 |   16 |       0
         10 |     1 |   1 | 2010 |   17 |       0
         10 |     1 |   1 | 2010 |   18 |       0
         10 |     1 |   1 | 2010 |   19 |       0
         10 |     1 |   1 | 2010 |   20 |       0
         10 |     1 |   1 | 2010 |   21 |       0
         10 |     1 |   1 | 2010 |   22 |       0
         10 |     1 |   1 | 2010 |   23 |       0
         10 |     1 |   2 | 2010 |    0 |       0
         10 |     1 |   2 | 2010 |    1 |       0
         10 |     1 |   2 | 2010 |    2 |       0
         10 |     1 |   2 | 2010 |    3 |       0
         10 |     1 |   2 | 2010 |    4 |       0
         10 |     1 |   2 | 2010 |    5 |       0
         10 |     1 |   2 | 2010 |    6 |       0
         10 |     1 |   2 | 2010 |    7 |       0
         10 |     1 |   2 | 2010 |    8 |       0
         10 |     1 |   2 | 2010 |    9 |       0
         10 |     1 |   2 | 2010 |   10 |       0
so on...

Ожидаемые результаты:

StationCode | Month | Day | Year | Hour | Rainfall
         10 |     1 |   1 | 2010 |    9 |       0
         10 |     1 |   1 | 2010 |   10 |       0
         10 |     1 |   1 | 2010 |   11 |       0
         10 |     1 |   1 | 2010 |   12 |       0
         10 |     1 |   1 | 2010 |   13 |       0
         10 |     1 |   1 | 2010 |   14 |       0
         10 |     1 |   1 | 2010 |   15 |       0
         10 |     1 |   1 | 2010 |   16 |       0
         10 |     1 |   1 | 2010 |   17 |       0
         10 |     1 |   1 | 2010 |   18 |       0
         10 |     1 |   1 | 2010 |   19 |       0
         10 |     1 |   1 | 2010 |   20 |       0
         10 |     1 |   1 | 2010 |   21 |       0
         10 |     1 |   1 | 2010 |   22 |       0
         10 |     1 |   1 | 2010 |   23 |       0
         10 |     1 |   2 | 2010 |    0 |       0
         10 |     1 |   2 | 2010 |    1 |       0
         10 |     1 |   2 | 2010 |    2 |       0
         10 |     1 |   2 | 2010 |    3 |       0
         10 |     1 |   2 | 2010 |    4 |       0
         10 |     1 |   2 | 2010 |    5 |       0
         10 |     1 |   2 | 2010 |    6 |       0
         10 |     1 |   2 | 2010 |    7 |       0
         10 |     1 |   2 | 2010 |    8 |       0

Спасибозаранее.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Вы можете отбросить предложения order-by в подзапросах, они не имеют никакого эффекта, поскольку строки все равно сортируются после слияния (объединения).

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

Попробуйте следующий общий порядок сортировки: год, месяц, день, ранг, час

Обновление:

Из вашего комментария кажется, что у вас проблема с критериями выбора, а не с порядком сортировки.

Попробуйте это:

SELECT StationCode, Month, Day, Year, Hour, Rainfall
from table1
where StationCode=10
and DateAdd('h',-8,DateValue(CStr([Month] & '/' & [Day] & '/' & [Year]))
    Between DateValue([month1] & '/' & [day1] & '/' & [year1])
        And DateValue([month2] & '/' & [day2] & '/' & [year2])
order by StationCode, Year, Month, Day, Hour

Хитрость здесь в том, чтобы сместить отметку времени на 8ч.

0 голосов
/ 26 апреля 2018

Попробуйте также добавить столбец Hour в предложение order by.
Насколько я понимаю, строки с 9 по 23 находятся в столбце «Час», который не будет отсортирован, поскольку он не включен в предложение order by.

Попробуйте этот заказ: Year, Month, Day, Hour

Данные будут отсортированы как 0-8 за 1 день 9-23 за 1 день 0-8 на 2 день 9-23 за день 2

Отфильтруйте данные, если хотите для day 1 and 0-8 hrs, day 2 and 9-23 hrs

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

...