2014-11-01 4 views
0

Уважаемые дамы и господа, К сожалению, я совершенно не знаком с программированием на sql, поэтому прошу прощения за какие-либо определенные ошибки или недостаток знаний. Для моей базы данных Access у меня есть таблица «report» с «reportnumber» в качестве id (может быть несколько версий каждого отчета с разными датами), а также «reportdate».Показать только записи с последней датой только с отображением идентификатора

Теперь я хочу, чтобы мой запрос отображал ТОЛЬКО последний «номер отчета» с последними «репортажами».

Я попытался следующий SQL код, который я нашел и адаптировать его, но это только дает мне сообщения об ошибках (синтаксис в декларации с Владельцев ВАРИАНТ):

SELECT reportnumber, MAX(reportdate) AS LatestDate FROM report 
GROUP BY reportnumber 
WITH numbered AS (SELECT reportnumber, reportdate 
ROW_NUMBER() OVER (PARTITION BY reportnumber 
ORDER BY reportdate DESC) AS rownum FROM report) 
SELECT reportnumber, reportdate 
FROM numbered WHERE rownum = 1; 

Я очень ценю вашу помощь , Большое спасибо и наилучшие пожелания,

Daniel Funk

ответ

0

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

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

SELECT reportnumber, reportdate, reportinfo 
FROM report 
WHERE reportdate = (SELECT max(reportdate) FROM report r2 
        WHERE r2.reportnumber = report.reportnumber) 

Если с другой стороны, вам нужно всего лишь один reportnumber с последней reportdate то простой GROUP BY будет работать.

SELECT reportnumber, MAX(reportdate) 
FROM report 
GROUP BY reportnumber 
+0

Уважаемый господин, большое вам спасибо за вашу помощь. Мне удалось применить вторую часть вашего предлагаемого запроса, теперь она выглядит так (icsrsnumb - это мой номер отчета): SELECT icsrsreport.icsrsnumb, Max (icsrsreport.messagedate) AS Maxvonmessagedate ОТ icsrsreport GROUP BY icsrsreport.icsrsnumb; К сожалению, когда я пытаюсь применить инструкцию sql для реализации других полей, я не могу, доступ продолжает просить меня ввести значение для messagedate для запроса. Как я могу применить это право? Спасибо –

+0

Не забывайте, что любые дополнительные столбцы либо должны быть частью группы, либо иметь совокупность вокруг них. Если ни один из них не работает для вас, вам нужно будет использовать первый запрос. Я не уверен, как создать его в средстве просмотра, но когда я вложил его в представление SQL, он работал нормально. –

+0

Дорогой сэр, после бесчисленных часов попыток заставить это работать, я, наконец, добился успеха, благодаря первому запросу, которое вы предоставили! Большое вам спасибо, вы действительно гений! Я пробовал с множеством других сложных запросов, но иногда более простой способ - ключ к решению! –

0

Вы можете сделать это с помощью простого group by пункта.

Редактировать:, чтобы получить дополнительные значения строк для агрегированного столбца в предложении group by, вы можете использовать подзапрос. Поскольку я не уверен, каковы ваши дополнительные столбцы, я просто добавил столбец с именем title.

Вот пример, и я разъясню, что происходит внизу.

http://sqlfiddle.com/#!2/61c3a/15

drop table if exists report; 
create table report 
(reportnumber mediumint, 
reportdate date, 
title varchar(60)); 

insert into report 
values 
(1, '2014-04-01', 'mysql tutorial, part 1'), 
(1, '2014-04-04', 'mysql tutorial, part 2'), 
(2, '2014-11-05', 'hbase tutorial, part 1'), 
(2, '2014-11-08', 'hbase tutorial, part 2'); 

select r.*, r2.title 
from (
    select reportnumber, max(reportdate) as maxdate 
    from report 
    group by reportnumber 
) r 
inner join report r2 
on r.reportnumber = r2.reportnumber 
and r.maxdate = r2.reportdate; 

Результаты подзапроса (то есть запрос в первом пункте from выше), по существу, проходит лечение в виде таблицы. Имея это в виду, мы можем присоединиться к нашей обычной таблице, report, к агрегированным результатам из подзапроса r, чтобы вывести правильные значения для других столбцов (в этом случае столбец title).

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

+0

Спасибо, я попытался это и теперь он только дает мне 1 листинг «reportnumber» и «messagedate» с последней датой - мне нужно, чтобы все отчеты с их указанным номером, которые имеют самые последние даты - например У меня есть отчет № 1 от 1.April и номер 1 отчета от 4.April, а также номер отчета 2 с 5. Ноябрь и номер отчета 2 с 8 ноября. Я хочу, чтобы в запросе отображался только номер отчета 1 с 4. апреля и номер отчета 2 из 8 Ноябрь. –

+0

Я создал новую скрипку. Это то, что вы ищете, http://sqlfiddle.com/#!2/e29581/3?Если да, дайте мне знать, и я уточню свой ответ. – foxygen

+0

Спасибо, что это работает, но, к сожалению, нет, если я хочу отображать другие столбцы тоже в соответствии с фильтром запросов - как я могу поместить другие столбцы там, которые будут отображаться, как вы дали в запросе скрипта? –

Смежные вопросы