1

我在 MSaccess 中有下表,我需要通过加入 2 列进行分组,并在某个日期/时间范围内,以及如果可能的类型和城市,给出重复的计数,但这不是强制性的。

LocationX LocationY DateTimeStamp,      City      Type
100       150       08/01/2013 8:59:44  Brisbane  RadioJob
101       155       08/01/2013 9:56:01  Brisbane  RadioJob
100       150       08/01/2013 8:49:39  Brisbane  RadioJob
103       150       08/01/2013 8:55:13  Brisbane  RadioJob

我需要将第 0 列和第 1 列连接在一起并进行计数,但只能选择特定时间范围内的位置。

例如,如果我在 08/01/2013 8:49:00 和 08/01/2013 8:59:59 之间选择,我应该得到下表:

LocationX LocationY CountOfLocation  City      Type
100       150       2                Brisbane  RadioJob
103       150       1                Brisbane  RadioJob

就目前而言,我在 MSaccess 中使用设计视图编写了 2 个查询以使其正常工作,但我想尝试并学习如何在一个 SQL 语句中执行此操作。

提前致谢,

麦克风

4

2 回答 2

4
SELECT LocationX, LocationY, City, Type, COUNT(*) CountOfLocation  
FROM   tableName
WHERE  DateTimeStamp BETWEEN '2013-08-01 8:49:00' AND '2013-08-01 8:59:59'
GROUP  BY LocationX, LocationY, City, Type

更新

SELECT LocationX, LocationY, City, Type, COUNT(*) AS CountOfLocation  
FROM   tableName
WHERE  DateTimeStamp BETWEEN #2013-08-01 08:49:00# AND #2013-08-01 08:59:59#
GROUP  BY LocationX, LocationY, City, Type
于 2013-01-08T00:06:30.327 回答
4
SELECT
   L.LocationX,
   L.LocationY,
   Count(*) AS CountOfLocation,
   L.City,
   L.Type
FROM
   Locations L
WHERE
   DateTimeStamp >= #08/01/2013 08:49:00#
   AND DateTimeStamp < #08/01/2013 09:00:00#
GROUP BY
   L.LocationX,
   L.LocationY,
   L.City,
   L.Type;

我想指出,我从使用BETWEEN到不等式的转变是经过深思熟虑的。原因是使用BETWEEN要求底层日期数据类型具有特定的分辨率或粒度(此处为秒)。但是,假设您的数据库有一天会增长并升级为 SQL Server。在解决了日期文字等明显问题之后,在转换为数据类型时会潜伏一个令人讨厌的小问题datetime:突然之间,秒之间的值将成为可能,并且数据将被不正确地排除。

我的专业建议是在所有数据库查询中始终使用我的查询中显示的语法:包括开始时间和排他结束时间。考虑到学习最佳实践习惯将在任何 DBMS 中为您提供良好的服务......

此外,虽然 Access 中的日期文字确实需要#包装器,但您可以选择在数据库级别选择 SQL-Server 兼容语法,然后使用'. 我实际上推荐这个开关,因为语法不那么古怪,并且在升迁场景中将是一个巨大的祝福,因为要做的工作要少得多。但是,如果您现在更改,您现有的查询都必须立即修复。

于 2013-01-08T00:06:47.770 回答