MS ACCESS различен на одном столбце - PullRequest
0 голосов
/ 19 ноября 2010

Я с трудом пытаюсь записать запрос к базе данных MS ACCESS. Таблица (вкладка), которую я выбираю, содержит 3 поля: id, rId и time. Я хочу выбрать запись для каждого диска, который есть, и я хочу получить запись с наибольшим временем. Запрос, который я пробовал, был таким:

SELECT * FROM tab GROUP BY rId ORDER BY time;

Однако, это дает мне всевозможные ошибки, такие как ошибка в порядке по, и функция агригатора не имеет достаточного количества параметров или что-то подобное Этот запрос просто невозможно написать, или я просто ошибаюсь.

[Примечание]
Это не то, что я пытаюсь сделать в дизайнере, и я не делаю отчет. Мне нужен запрос, который может вернуть необходимые данные.

Ответы [ 4 ]

2 голосов
/ 19 ноября 2010

Если у вас есть предложение GROUP BY, вам необходимо иметь агрегатную функцию.Поверьте сообщению об ошибке.

Попробуйте:

SELECT rId, MAX(time) as highest FROM tab GROUP BY rId ORDER BY highest desc;

У вас будут проблемы со столбцами с именами, такими как time.Это не очень наглядно, и это может быть столкновение ключевых слов.

0 голосов
/ 30 января 2013

Для доступа вы можете использовать запрос SQL Select, который я представляю здесь:

Например, у вас есть эта таблица:

КЛИЕНТ ||NOMBRES ||ПОЧТА

888 ||T800 ARNOLD ||t800.arnold@cyberdyne.com

123 ||ДЖОН КОННОР ||s.connor@skynet.com

125 ||SARAH CONNOR ||s.connor@skynet.com

И вам нужно выбрать только отдельные письма.Вы можете сделать это с помощью:

SQL SELECT:

SELECT MAX(p.CLIENTE) AS ID_CLIENTE
, (SELECT TOP 1 x.NOMBRES 
FROM Rep_Pre_Ene_MUESTRA AS x 
WHERE x.MAIL=p.MAIL 
 AND x.CLIENTE=(SELECT MAX(l.CLIENTE) FROM Rep_Pre_Ene_MUESTRA AS l WHERE x.MAIL=l.MAIL)) AS NOMBRE, 
p.MAIL
FROM Rep_Pre_Ene_MUESTRA AS p
GROUP BY p.MAIL;

Вы можете использовать это, чтобы выбрать максимальный идентификатор, имя корреспондента для этого максимального идентификатора, вы можете добавить любой другой атрибут, которыйпуть.Затем в конце вы помещаете отдельный столбец для фильтрации и группируете его только по последнему отдельному столбцу.

Это даст вам максимальный идентификатор с соответствующими данными, вы можете использовать min или любые другие функции, и выскопируйте эту функцию на подзапросы.

Этот выбор вернет:

CLIENTE ||NOMBRES ||ПОЧТА

888 ||T800 ARNOLD ||t800.arnold@cyberdyne.com

125 ||SARAH CONNOR ||s.connor@skynet.com

Не забудьте проиндексировать выбранные столбцы, и отдельный столбец не должен содержать числовые данные в верхнем или нижнем регистре, иначе он не будет работать.Это будет работать только с одним заказным письмом.Удачного кодирования !!!

0 голосов
/ 20 ноября 2010

Попробуйте:

SELECT * FROM tab t1 WHERE NOT EXISTS
   (SELECT * FROM tab t2 WHERE t2.rid = t1.rid AND t2.time > t1.time);

Если я правильно понимаю ваш вопрос, вы не хотите использовать GROUP BY.Вам не нужны агрегированные данные из групп строк, вам нужны фактические полные строки из исходной таблицы, но вы хотите отфильтровать все, кроме самой последней записи.

0 голосов
/ 19 ноября 2010

РЕДАКТИРОВАНИЕ, основанное на отзывах / комментариях к исходному сообщению.

на основе отзывов, я бы написал свой запрос как

select rID,
       max( ID ) as LastIDAdded,
       max( Time ) as LastDateTimeHistory
   from
       YourTable
   group by 
      rid

Теперь, в Access, используя их графический интерфейс, выдолжен сообщить запросу, что вы делаете итоги.Выберите вашу таблицу и добавьте 3 столбца.Затем в строке, в которой указано, что вы собираетесь «итого», поместите MAX () в столбцы ID и Time.Кроме того, при выполнении итогов будет отображаться строка GROUP BY, вы хотите установить флажок do в столбце rID.Это лучшее, что у меня осталось из памяти интерфейса запросов Access, и неуверенность в зависимости от используемой версии.HTH.

ОРИГИНАЛЬНЫЙ ОТВЕТ

Хотя у @duffymo есть опция типичного запроса, чтобы сгруппировать max (), я не уверен, что это именно то, что вам нужно.Как вы сказали, у вас есть 3 поля.Похоже, ваш «идентификатор» является суррогатным ключом или ключом идентификатора с автоинкрементом для сохранения уникальных строк в таблице.Ваш «rID» - это то, что вы хотите сгруппировать, и настало время получить самое последнее время в данной группе.

В зависимости от того, как были добавлены записи и что произошло для предыдущего клиента, записиобрабатывались в системе планирования, где любая запись могла иметь любую отметку «время».Поэтому последовательно вы МОЖЕТЕ получить что-то вроде

ID   rID   Time
1     1     1pm
2     2     4pm
3     2     5pm
4     1     9AM
5     2     3pm

In such case, if you grouped by rID, your MAX() on time for rID = 1 would be the 1pm slot with ID = 1.  And for group rID = 2, the MAX() time of 5pm would be ID = 3.

При этом, если вы намереваетесь использовать столбец «ID» для привязки, вы захотите получить правильную запись «ID»Кроме того, что в ОБА этих сценариях НЕ является последней последовательностью «ID» для группы по «rID».

Что, помимо всего прочего, менее чем замечательная способность создавать запросы в Access через конструктор, а не кодировать напрямую,это может быть немного сложнее и потребовать от вас написать функцию, которая фактически выполняет последний запрос, который вы хотите.

Если этот сценарий - то, что вы ищете, я попытаюсь откопать и обработать запрос, которыйбудет работать на приведенном выше примере.и повторно отправьте назад.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...