MSSQLSRV - 使用重复行过滤掉结果

时间:2013-12-05 12:51:27

标签: sql sql-server tsql etl

我遇到了令人沮丧的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中玩过的示例数据,以及我得到的结果(这是所需的结果)。

data results

在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)

1 个答案:

答案 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];