我遇到了令人沮丧的SQL Server问题。我需要从包含通过ETL加载的文件的详细信息的表创建一个视图。该表包含文件ID(唯一),文件名,serverid(与已加载到的服务器相关)。
文件名的前2个字母是国家代码,即美国,英国,GB,DE - 每个国家/地区加载了多个文件。我想获得每个国家/地区文件ID最高的记录。下面的查询执行此操作,但它返回最高记录PER SERVER,因此可能有多个文件ID - 即它将返回server1和server2上该国家/地区的最高文件ID - 我只希望最高记录完全停止。
我玩了一个关于MySQL的等价查询并通过注释掉最后一行(GROUP BY t.[server_id]
)来实现它,这似乎工作得很好,但当然MSSQLSRV需要{{{{{{{ 1}}放在SELECT
语句中。
那么,如何在SQL Server中获得相同的结果 - 即获得一个具有最高file_id的结果,而不会获得不同server_id的重复行?
希望我能说清楚。
GROUP BY
修改
以下是我在MySQL中玩过的示例数据,以及我得到的结果(这是所需的结果)。
在SQL Server中,由于我无法注释掉最后一个SELECT MAX(t.[file_id]) AS FID
,LEFT(t.[full_file_name], 2) AS COUNTRYCODE
,t.[server_id]
FROM [tracking_files] t
WHERE t.server_id IS NOT NULL
AND t.[server_id] = (
SELECT TOP 1 [server_id]
FROM [tracking_files] md
WHERE md.[file_id] = t.file_id
)
GROUP BY LEFT(t.[full_file_name], 2)
,t.[server_id]
子句,我们看到,例如GB的两个file_ids(一个用于服务器1,一个用于服务器2)
答案 0 :(得分:2)
如果您使用的是SQL Server 2005或更高版本,则可以使用ROW_NUMBER():
SELECT t.File_ID,
t.full_file_name,
t.CountryCode,
t.Server_ID
FROM ( SELECT t.[File_ID],
t.full_file_name,
CountryCode = LEFT(t.full_file_name, 2),
t.Server_ID,
RowNumber = ROW_NUMBER() OVER(PARTITION BY LEFT(t.full_file_name, 2) ORDER BY [File_ID] DESC)
FROM [tracking_files] t
) t
WHERE t.RowNumber = 1;
如果您使用的是旧版本,则需要使用子查询来获取每个国家/地区代码的最大文件ID,然后再加入主表:
SELECT t.[File_ID],
t.full_file_name,
CountryCode = LEFT(t.full_file_name, 2),
t.Server_ID
FROM [tracking_files] t
INNER JOIN
( SELECT MaxFileID = MAX([File_ID])
FROM [tracking_files] t
GROUP BY LEFT(t.full_file_name, 2)
) MaxT
ON MaxT.MaxFileID = t.[File_ID];