我需要创建一个MS Access查询,该查询只返回序列号的一个实例以及其他一些列。例如
SerialNumber CRM EmailClient VersionBuild IPAddress DateLogged
------------ ---- ----------- ------------ --------- ----------
123456 Outlook Outlook 4.7.4 0.0.0.0 20120625
123456 SugarCRM SMTP 4.6.1 0.0.0.0 20120621
435352 ACT! Outlook 4.5.2 0.0.0.0 20120619
537352 ACT! SMTP 4.5.3 0.0.0.0 20120619
结果将是
SerialNumber CRM EmailClient VersionBuild IPAddress DateLogged
------------ ---- ----------- ------------ --------- ----------
123456 Outlook Outlook 4.7.4 0.0.0.0 20120625
435352 ACT! Outlook 4.5.2 0.0.0.0 20120619
537352 ACT! SMTP 4.5.3 0.0.0.0 20120619
我试图使用以下查询来完成此操作。我认为First和Group取消了对方。
SELECT FIRST(LogData.SerialNumber), LogData.CRM, LogData.EmailClient, LogData.VersionBuild, LogData.IPAddress, LogData.DateLogged
FROM LogData
GROUP BY LogData.CRM, LogData.EmailClient, LogData.VersionBuild, LogData.IPAddress, LogData.DateLogged
答案 0 :(得分:1)
在评论中,您提到LogData没有主键。如果添加自动编号主键,则问题变得非常容易解决。
使用子查询为每个id
组返回单个SerialNumber
值,并将子查询INNER JOIN
返回到LogData
。
SELECT base.*
FROM
LogData AS base
INNER JOIN (
SELECT SerialNumber, Min(id) AS which_id
FROM LogData
GROUP BY SerialNumber
) AS sub
ON base.id = sub.which_id;
将base.*
替换为您要显示的字段列表。
答案 1 :(得分:0)
我想你想这样做:
SELECT LogData.SerialNumber, FIRST(LogData.First), FIRST(LogData.Last) FROM LogData GROUP BY LogData.SerialNumber
但是要注意:这可能会导致(不是“FIRST”功能)的混合记录,如:
Serial First Last ------ ----- ---- 123456 Frank Smith
顺便说一下:所有SQL系统都不支持“FIRST”-Grouping-Function: http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html您可以使用其他函数来实现sql标准...
答案 2 :(得分:0)
这不是很漂亮但是......
SELECT L.SerialNumber,
(Select Top 1 A.First from LogData as A where A.SerialNumber = L.SerialNumber Order by A.First, A.Last) AS [First],
(Select Top 1 A.Last from LogData as A where A.SerialNumber = L.SerialNumber Order by A.First, A.Last) AS [Last]
FROM LogData AS L
GROUP BY L.SerialNumber;
这基本上是托马斯的答案,除了因为你使用子查询,你可以通过命令来确保你总是得到预期的结果。