Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / TOP 1 + Union / 12 сообщений из 12, страница 1 из 1
15.09.2018, 11:19
    #39702912
MokeevP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TOP 1 + Union
Здравствуйте, уважаемые форумчане

дано: таблица movng с записями о движениях автомобилей
надо: запрос выводящий две записи - начало движения за день и конец движения за день
хотел решить так:
Код: plsql
1.
2.
3.
SELECT TOP 1 ID, DateMove FROM Movng WHERE (((Speed)<>0) AND ((Car)=15) AND ((Format([DateMove],"dd/mm/yyyy"))=#8/1/2017#)) ORDER BY DateMove
union
SELECT TOP 1 ID, DateMove FROM Movng WHERE (((Speed)<>0) AND ((Car)=15) AND ((Format([DateMove],"dd/mm/yyyy"))=#8/1/2017#)) ORDER BY DateMove desc


но возвращает только одну запись, а не две
ЧЯДНТ
____
vk.com/taenfox
...
Рейтинг: 0 / 0
15.09.2018, 15:54
    #39702961
Шаман
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TOP 1 + Union
Добрый день,
Как вариант, решение на скорую руку, путём создания двух запросов.
Запрос1
Код: vbnet
1.
2.
3.
SELECT Min(Movng.ID) AS [Min-ID], Max(Movng.ID) AS [Max-ID]
FROM Movng
HAVING (((Min(Movng.Speed))<>0));


Запрос2
Код: vbnet
1.
2.
3.
SELECT Movng.ID
FROM (Запрос1 RIGHT JOIN Movng ON Запрос1.[Min-ID]=Movng.ID) LEFT JOIN Запрос1 AS Запрос1_1 ON Movng.ID=Запрос1_1.[Max-ID]
WHERE ((([Запрос1.Min-ID] & [Запрос1_1.Max-ID]) Is Not Null));


Результат вреде бы тот что нужен.
...
Рейтинг: 0 / 0
15.09.2018, 16:42
    #39702969
MokeevP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TOP 1 + Union
ШаманДобрый день,
Как вариант, решение на скорую руку, путём создания двух запросов.
Запрос1
Код: vbnet
1.
2.
3.
SELECT Min(Movng.ID) AS [Min-ID], Max(Movng.ID) AS [Max-ID]
FROM Movng
HAVING (((Min(Movng.Speed))<>0));


Запрос2
Код: vbnet
1.
2.
3.
SELECT Movng.ID
FROM (Запрос1 RIGHT JOIN Movng ON Запрос1.[Min-ID]=Movng.ID) LEFT JOIN Запрос1 AS Запрос1_1 ON Movng.ID=Запрос1_1.[Max-ID]
WHERE ((([Запрос1.Min-ID] & [Запрос1_1.Max-ID]) Is Not Null));


Результат вреде бы тот что нужен.

Здравствуйте
Спасибо за предложенный вариант, мне оказалось достаточно (и даже это лучше чем я сначала просил) Запрос1. Я его подкорректировал для себя:

Код: plsql
1.
2.
3.
SELECT Min([Movng].[ID]) AS Start, Max([Movng].[ID]) AS Stop
FROM Movng
WHERE (((Movng.Car)=15) AND ((Movng.Speed)<>0) AND ((Format([DateMove],"dd/mm/yyyy"))="01.08.2017"));



Но ещё если бы вот узнать почему мой первый запрос не сработал...

PS: да, у меня варварский подход к времени
...
Рейтинг: 0 / 0
15.09.2018, 19:40
    #39703000
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TOP 1 + Union
попробуйте в первом варианте поставить UNION ALL
...
Рейтинг: 0 / 0
17.09.2018, 13:03
    #39703537
MokeevP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TOP 1 + Union
Jossпопробуйте в первом варианте поставить UNION ALL

В таком случае:
Код: plsql
1.
2.
3.
SELECT TOP 1 ID, DateMove FROM Movng WHERE (((Speed)<>0) AND ((Car)=15) AND ((Format([DateMove],"dd/mm/yyyy"))=#8/1/2017#)) ORDER BY DateMove
UNION ALL
SELECT TOP 1 ID, DateMove FROM Movng WHERE (((Speed)<>0) AND ((Car)=15) AND ((Format([DateMove],"dd/mm/yyyy"))=#8/1/2017#)) ORDER BY DateMove DESC;


игнорируется оператор Desc почему то, то есть запрос возвращает две записи соответствующие
Код: plsql
1.
SELECT TOP 1 ID, DateMove FROM Movng WHERE (((Speed)<>0) AND ((Car)=15) AND ((Format([DateMove],"dd/mm/yyyy"))=#8/1/2017#)) ORDER BY DateMove


Я что-то ещё больше запутался. В UNION ведь можно и идентичные запросы склеить? Почему разносортированные болеют?
...
Рейтинг: 0 / 0
17.09.2018, 13:17
    #39703554
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TOP 1 + Union
MokeevPигнорируется оператор Desc почему тоПотому что запросы надо обрамить скобками.
...
Рейтинг: 0 / 0
17.09.2018, 13:29
    #39703577
MokeevP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TOP 1 + Union
Akina, действительно, исправил по Вашей рекомендации, всё ок! Можно я в следующий раз сразу Вам писать буду? :D
...
Рейтинг: 0 / 0
17.09.2018, 14:59
    #39703662
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TOP 1 + Union
Можно не надо...
...
Рейтинг: 0 / 0
17.09.2018, 15:38
    #39703702
TOP 1 + Union
MokeevPигнорируется оператор Desc почему то, то есть запрос возвращает две записи соответствующие ORDER BY DateMove Вы уверены, что не ORDER BY DateMove DESC?
Дело в том, что в UNION имена полей берутся из 1-й секции, а сортировка из последней (и то, при соблюдении определенных условий).

Кстати, Format([DateMove],"dd/mm/yyyy")=#8/1/2017# - неправильный подход. Format здесь совершенно лишний. Сначала вы получаете строку в виде "01.08.2017", а затем обратное преобразование в дату (для сравнения с критерием). При этом игнорируются индексы, которые вероятно есть у поля. Правильно так:
[DateMove] =#8/1/2017#
...
Рейтинг: 0 / 0
20.09.2018, 17:08
    #39705750
MokeevP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TOP 1 + Union
Кривцов АнатолийMokeevPигнорируется оператор Desc почему то, то есть запрос возвращает две записи соответствующие ORDER BY DateMove Вы уверены, что не ORDER BY DateMove DESC?
Дело в том, что в UNION имена полей берутся из 1-й секции, а сортировка из последней (и то, при соблюдении определенных условий).

Кстати, Format([DateMove],"dd/mm/yyyy")=#8/1/2017# - неправильный подход. Format здесь совершенно лишний. Сначала вы получаете строку в виде "01.08.2017", а затем обратное преобразование в дату (для сравнения с критерием). При этом игнорируются индексы, которые вероятно есть у поля. Правильно так:
[DateMove] =#8/1/2017#

Я не знаком с технической частью вопроса, но считал что юнион собирает воедино две таблицы, сформированные запросами со своими тараканами (фильтрами, сортировкой). На практике мне объяснили что я дурак и если я хочу так то нужно прям вот как хочу то нада явно обозначить границы этих самых запросов. То есть конструкция (запрос с сортировкой топ 1) Юнион (запрос с сортировкой топ 1) вывела именно то, что я хотел, а именно - таблица из двух строк с первой и последней записью в рамках критерия.

А вот про формат прошу пояснить ещё раз, для самых зелёных и меня
если я в запросе делаю поле с выражением format... очень похожим на дату и не указываю никаких дополнительных инструкций то акс делает преобразование в дату? Зачем я вообще начал эту штуку использовать - у меня там ещё и время хранится и я отбирал все записи на дату. Есть более адекватные варианты как это сделать?

Кстати, от варианта Шамана отказался, потому что не смог совладать с датами, а сделать хотелось по-скорее
И ещё, куда тут дилетанты складывают свои детища для оценки профессионалами и вольношатающимися юзерами? Новая тема или расстреляют?)
...
Рейтинг: 0 / 0
20.09.2018, 20:37
    #39705828
Прогер_самоучка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TOP 1 + Union
MokeevPНовая тема или расстреляют?)почему "или" ?
"И"!
...
Рейтинг: 0 / 0
20.09.2018, 22:59
    #39705892
MokeevP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TOP 1 + Union
Прогер_самоучкаMokeevPНовая тема или расстреляют?)почему "или" ?
"И"!

Да будет так !
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / TOP 1 + Union / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]