SQL-запрос - необходимо добавить самую последнюю дату

У меня есть две таблицы, одна из которых "Свойство" имеет идентификатор первичного ключа с номерами 1-9, а другая ("Просмотры") имеет поле, которое использует один из идентификационных номеров в каждой записи - некоторые числа могут использоваться более одного раза, например 4 может быть в двух записях. В просмотре также есть поле даты для каждой записи.

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

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

У меня есть это до сих пор, чтобы подсчитать идентификаторы, но я также пытаюсь добавить дату:

SELECT Property.ID,
Count(Viewings.Property_Viewed) AS ViewingCount
FROM Property LEFT JOIN Viewings ON Property.ID = Viewings.Property_Viewed
GROUP BY Property.ID;

Вот моя попытка добавить дату, которая не завершена:

SELECT Property.ID, Viewings.Viewing_Date,
Count(Viewings.Property_Viewed) AS ViewingCount,
MAX(Viewings.Viewing_Date) AS Vdate
FROM Property LEFT JOIN Viewings ON Property.ID = Viewings.Property_Viewed
GROUP BY Property.ID;

person al3    schedule 23.12.2013    source источник
comment
Покажите нам на примере, где ваш второй запрос терпит неудачу.   -  person user2989408    schedule 23.12.2013
comment
@ user2989408 Я не знаю, как связать дату с остальной частью запроса. Например, у меня есть Proporty.ID, связанный с Viewings.Propoerty_Viewed.   -  person al3    schedule 23.12.2013


Ответы (2)


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

SELECT
    Property.ID, 
    Count(Viewings.Property_Viewed) AS ViewingCount,
    MAX(Viewings.Viewing_Date) AS Vdate
FROM
    Property
    LEFT JOIN Viewings
    ON Property.ID = Viewings.Property_Viewed
GROUP BY Property.ID;

Этот набор результатов должен включать строку для каждого Property.ID с количеством просмотров этого ресурса и датой последнего просмотра. Столбец даты будет содержать null для всех свойств, не найденных в таблице Viewings.

Проблема с Viewings.Viewing_Date в предложении SELECT заключается в том, что это не...

  1. выражение поля, основанное на агрегатной функции (количество, минимум, максимум и т. д.)
  2. включены в пункт GROUP BY

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

person HansUp    schedule 23.12.2013
comment
ВАУ это было так просто..? хаха спасибо! - person al3; 24.12.2013

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

Итак, вы бы сделали что-то вроде:

SELECT 
    P.Id AS PropertyId
    VC.ViewingCount,
    VD.LastViewing
FROM Property P
LEFT JOIN
( 
    SELECT 
        Property_Viewed AS PropertyId
        Count(Viewings.Property_Viewed) AS ViewingCount 
    FROM Viewings
    GROUP BY Property_Viewed
) AS VC ON P.Id = VC.PropertyId
LEFT JOIN
(
    SELECT 
        Property_Viewed AS PropertyId
        MAX(Viewings.Viewing_Date) AS LastViewing
    FROM Viewings
    GROUP BY Property_Viewed
) AS VD ON P.Id = VD.PropertyId
person brianfeucht    schedule 23.12.2013