Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 TOP 1 + Union  [new]
MokeevP
Member

Откуда: Нижний Новгород
Сообщений: 131
Здравствуйте, уважаемые форумчане

дано: таблица movng с записями о движениях автомобилей
надо: запрос выводящий две записи - начало движения за день и конец движения за день
хотел решить так:
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

К сообщению приложен файл. Размер - 17Kb
15 сен 18, 11:19    [21675423]     Ответить | Цитировать Сообщить модератору
 Re: TOP 1 + Union  [new]
Шаман
Member

Откуда:
Сообщений: 148
Добрый день,
Как вариант, решение на скорую руку, путём создания двух запросов.
Запрос1
SELECT Min(Movng.ID) AS [Min-ID], Max(Movng.ID) AS [Max-ID]
FROM Movng
HAVING (((Min(Movng.Speed))<>0));

Запрос2
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));

Результат вреде бы тот что нужен.
15 сен 18, 15:54    [21675554]     Ответить | Цитировать Сообщить модератору
 Re: TOP 1 + Union  [new]
MokeevP
Member

Откуда: Нижний Новгород
Сообщений: 131
Шаман
Добрый день,
Как вариант, решение на скорую руку, путём создания двух запросов.
Запрос1
SELECT Min(Movng.ID) AS [Min-ID], Max(Movng.ID) AS [Max-ID]
FROM Movng
HAVING (((Min(Movng.Speed))<>0));

Запрос2
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. Я его подкорректировал для себя:

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: да, у меня варварский подход к времени
15 сен 18, 16:42    [21675568]     Ответить | Цитировать Сообщить модератору
 Re: TOP 1 + Union  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4833
попробуйте в первом варианте поставить UNION ALL
15 сен 18, 19:40    [21675640]     Ответить | Цитировать Сообщить модератору
 Re: TOP 1 + Union  [new]
MokeevP
Member

Откуда: Нижний Новгород
Сообщений: 131
Joss
попробуйте в первом варианте поставить 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
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 почему то, то есть запрос возвращает две записи соответствующие
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 ведь можно и идентичные запросы склеить? Почему разносортированные болеют?
17 сен 18, 13:03    [21676757]     Ответить | Цитировать Сообщить модератору
 Re: TOP 1 + Union  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 18751
MokeevP
игнорируется оператор Desc почему то
Потому что запросы надо обрамить скобками.
17 сен 18, 13:17    [21676786]     Ответить | Цитировать Сообщить модератору
 Re: TOP 1 + Union  [new]
MokeevP
Member

Откуда: Нижний Новгород
Сообщений: 131
Akina, действительно, исправил по Вашей рекомендации, всё ок! Можно я в следующий раз сразу Вам писать буду? :D
17 сен 18, 13:29    [21676817]     Ответить | Цитировать Сообщить модератору
 Re: TOP 1 + Union  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 18751
Можно не надо...
17 сен 18, 14:59    [21676979]     Ответить | Цитировать Сообщить модератору
 Re: TOP 1 + Union  [new]
Кривцов Анатолий
Member

Откуда:
Сообщений: 206
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#
17 сен 18, 15:38    [21677067]     Ответить | Цитировать Сообщить модератору
 Re: TOP 1 + Union  [new]
MokeevP
Member

Откуда: Нижний Новгород
Сообщений: 131
Кривцов Анатолий
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... очень похожим на дату и не указываю никаких дополнительных инструкций то акс делает преобразование в дату? Зачем я вообще начал эту штуку использовать - у меня там ещё и время хранится и я отбирал все записи на дату. Есть более адекватные варианты как это сделать?

Кстати, от варианта Шамана отказался, потому что не смог совладать с датами, а сделать хотелось по-скорее
И ещё, куда тут дилетанты складывают свои детища для оценки профессионалами и вольношатающимися юзерами? Новая тема или расстреляют?)
20 сен 18, 17:08    [21681164]     Ответить | Цитировать Сообщить модератору
 Re: TOP 1 + Union  [new]
Прогер_самоучка
Member

Откуда:
Сообщений: 67383
MokeevP
Новая тема или расстреляют?)
почему "или" ?
"И"!
20 сен 18, 20:37    [21681364]     Ответить | Цитировать Сообщить модератору
 Re: TOP 1 + Union  [new]
MokeevP
Member

Откуда: Нижний Новгород
Сообщений: 131
Прогер_самоучка
MokeevP
Новая тема или расстреляют?)
почему "или" ?
"И"!


Да будет так !
20 сен 18, 22:59    [21681469]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить