分组依据以显示独特的字段

Group by to show unique fields

目前我的代码如下:

SELECT Volunteer.VolunteerID, Volunteer.LastName, Volunteer.FirstName, Observations.VolunteerID, Roost.RoostID, Roost.UTME, Roost.UTMN, Roost.DecimalDegrees, Observations.Date, Location.LocationName, Location.Address, Town.Town
FROM (((Volunteer INNER JOIN Observations ON Volunteer.[VolunteerID]= Observations.[VolunteeriD])
LEFT JOIN Roost ON Roost.[RoostID]= Observations.[RoostID])
LEFT JOIN Location ON Location.[LocationID]= Roost.[LocationID])
LEFT JOIN Town ON Location.[TownID]= Town.[TownID]
ORDER BY Volunteer.LastName, Volunteer.FirstName;

目前我的 table 的一部分看起来像这样:

    Observations.VolunteerID | Observations.LocationID | Date

    Bob                      | Main St                 | 2015-01-01  
    Bob                      | Main St                 | 2015-02-02
    Sally                    | Fox St                  | 2015-02-02
    Dave                     | Long St                 | 2015-02-02
    Dave                     | Taylor St               | 2015-02-05
    Lindsay                  | New St                  | 2015-02-01
    Lindsay                  | New St                  | 2015-02-08
    Lindsay                  | Ray St                  | 2015-02-10
    Lindsay                  | Main St                 | 2015-02-25
    Lindsay                  | Taylor St               | 2015-02-31

但是,我想添加一个 GROUP BY 语句(我认为),它由 VolunteerIDLocationID 分组,所以我得到以下输出。我想知道志愿者去过的每个地点,如果他们多次访问同一个地点,我想查看最近的日期。我如何将其合并到我的原始代码中?

    Observations.VolunteerID | Observations.LocationID | Date
    Bob                      | Main St                 | 2015-02-02
    Sally                    | Fox St                  | 2015-02-02
    Dave                     | Long St                 | 2015-02-02
    Dave                     | Taylor St               | 2015-02-05
    Lindsay                  | New St                  | 2015-02-08
    Lindsay                  | Ray St                  | 2015-02-10
    Lindsay                  | Main St                 | 2015-02-25
    Lindsay                  | Taylor St               | 2015-02-31

已更新代码,但仍然出现语法错误(查询表达式中缺少运算符 'Volunteer.FirstName GROUP BY Observations.VolunteerID'。

SELECT Volunteer.VolunteerID, Volunteer.LastName, Volunteer.FirstName, Observations.VolunteerID, Roost.RoostID, Roost.UTME, Roost.UTMN, Roost.DecimalDegrees, Max([Observations.Date]), Location.LocationName, Location.Address, Town.Town
FROM (((Volunteer INNER JOIN Observations ON Volunteer.[VolunteerID]= Observations.[VolunteeriD])
LEFT JOIN Roost ON Roost.[RoostID]= Observations.[RoostID])
LEFT JOIN Location ON Location.[LocationID]= Roost.[LocationID])
LEFT JOIN Town ON Location.[TownID]= Town.[TownID]
ORDER BY Volunteer.LastName, Volunteer.FirstName
GROUP BY Observations.VolunteerID, Observations.LocationID;

maxgroup by 子句似乎就足够了:

select Observations.VolunteerID, Observations.LocationID, max([Date])
from <...>
group by Observations.VolunteerID, Observations.LocationID

您需要在日期上使用 GROUP BY 和聚合函数 MAX()

SELECT VolunteerID, LocationID, MAX(Date)
FROM(
SELECT 
  Volunteer.VolunteerID, 
  Volunteer.LastName, 
  Volunteer.FirstName, 
  Observations.VolunteerID, 
  Roost.RoostID, 
  Roost.UTME, 
  Roost.UTMN, 
  Roost.DecimalDegrees, 
  Observations.Date, 
  Location.LocationName, 
  Location.Address, 
  Town.Town
FROM 
  (((Volunteer 
  INNER JOIN Observations ON Volunteer.[VolunteerID]= Observations.[VolunteeriD])
  LEFT JOIN Roost ON Roost.[RoostID]= Observations.[RoostID])
  LEFT JOIN Location ON Location.[LocationID]= Roost.[LocationID])
  LEFT JOIN Town ON Location.[TownID]= Town.[TownID]
ORDER BY Volunteer.LastName, Volunteer.FirstName
) foo
GROUP BY VolunteerID, LocationID

ORDER BY 子句放在 GROUP BY 之后。

Max([Observations.Date])更改为Max(Observations.Date)

SELECT 列表中不是聚合表达式的任何字段表达式添加到 GROUP BY

SELECT
    Volunteer.VolunteerID,
    Volunteer.LastName,
    Volunteer.FirstName,
    Observations.VolunteerID,
    Roost.RoostID,
    Roost.UTME,
    Roost.UTMN,
    Roost.DecimalDegrees,
    Max(Observations.Date) AS latest_observation,
    Location.LocationName,
    Location.Address,
    Town.Town
FROM (((Volunteer INNER JOIN Observations ON Volunteer.[VolunteerID]= Observations.[VolunteeriD])
    LEFT JOIN Roost ON Roost.[RoostID]= Observations.[RoostID])
    LEFT JOIN Location ON Location.[LocationID]= Roost.[LocationID])
    LEFT JOIN Town ON Location.[TownID]= Town.[TownID]
GROUP BY
    Volunteer.VolunteerID,
    Volunteer.LastName,
    Volunteer.FirstName,
    Observations.VolunteerID,
    Roost.RoostID,
    Roost.UTME,
    Roost.UTMN,
    Roost.DecimalDegrees,
    Location.LocationName,
    Location.Address,
    Town.Town
ORDER BY Volunteer.LastName, Volunteer.FirstName;

但是我不确定这种分组是否合适。在这个问题中,您想对 Observations.VolunteerIDObservations.LocationID 进行分组。这个更大的 GROUP BY 可能不会给你相同的结果。

如果是这种情况,您可以对 SELECT 字段使用聚合函数,然后从 GROUP BY 中删除该字段。例如...

SELECT Max(Volunteer.LastName)

假设 LastName 对于给定的 VolunteerID 始终相同,Max(Volunteer.LastName) 将为您提供相同的值。