2013-07-15 51 views
0

我试图想出一种方法,只能使用最近的帐户只能获得16行(这是基于SERV_ACCT的16条不同记录)。我正在使用Distinct和group by,我认为这会解决这个问题,但我一直得到20行。SQL Server Distinct Columns

DECLARE

@CustomerID int = 8, 
@UtilityCompanyID int = 1 


    SELECT DISTINCT SERV_ACCT, ACCOUNT, MAX(INV_DATE) 
    FROM tblAPSData 

    WHERE SERV_ACCT NOT IN (SELECT ServiceAccount 
       FROM tblMEP_Meters 
       JOIN tblMEP_Sites 
       ON tblMEP_Meters.SiteID = tblMEP_Sites.ID 

       JOIN tblMEP_Projects 
       ON tblMEP_Projects.ID = tblMEP_Sites.ProjectID 

       WHERE CustomerID = 8 
       AND Type = 1 
       ) 

    AND ACCOUNT IN (SELECT AccountNumber 
        FROM tblMEP_CustomerAccounts 
        WHERE CustomerID = @CustomerID 
        AND UtilityCompanyID = @UtilityCompanyID) 

    AND INV_DATE > DATEADD(month, -6, getdate()) 
    GROUP BY SERV_ACCT, ACCOUNT 
    ORDER BY SERV_ACCT 

结果如下:

SERV_ACCT ACCOUNT (No column name) 
0289S61288 117512280 2013-06-12 00:00:00.000 
0492S90281 117512280 2013-06-12 00:00:00.000 
0492S90281 651412281 2013-04-08 00:00:00.000 
1303S90280 117512280 2013-06-12 00:00:00.000 
1435S01282 117512280 2013-06-12 00:00:00.000 
1440S13289 312937281 2013-06-24 00:00:00.000 
1548S00286 117512280 2013-06-12 00:00:00.000 
1548S00286 308710287 2013-04-08 00:00:00.000 
2498S21288 117512280 2013-06-12 00:00:00.000 
5384S92284 979437282 2013-06-24 00:00:00.000 
5538S21284 117512280 2013-06-12 00:00:00.000 
6109S12286 117512280 2013-06-12 00:00:00.000 
7358S00281 117512280 2013-06-12 00:00:00.000 
7358S00281 659710281 2013-04-08 00:00:00.000 
7488S22289 117512280 2013-06-12 00:00:00.000 
8058S12287 117512280 2013-06-12 00:00:00.000 
9058S00288 117512280 2013-06-12 00:00:00.000 
9168S00282 117512280 2013-06-12 00:00:00.000 
9168S00282 570810282 2013-04-08 00:00:00.000 
9645S21281 117512280 2013-06-12 00:00:00.000 
+1

既然你是'SERV_ACCT'分组和'ACCOUNT'您将返回这两个领域的所有'DISTINCT'组合,你需要决定你想返回值,你可以使用最大/最小值,如果它是按日期。 –

回答

0

到的JOIN有更好的表现首先,我会结合您的where子句中的语句。然后使用分区函数按日期对行进行排名。

RANK (Transact-SQL)

SELECT * FROM 
(
SELECT 
aps.SERV_ACCT 
, aps.ACCOUNT 
, ROW_NUMBER() OVER (PARTITION BY aps.SERV_ACCT ORDER BY aps.INV_DATE DESC) [row] 
    FROM tblAPSData aps 
    INNER JOIN tblMEP_Meters mep 
     ON aps.SERV_ACCT = mep.ServiceAccount 
    INNER JOIN tblMEP_Sites site 
     ON site.SiteID = mep.ID 
    INNER JOIN tbl_MEP_Projects proj 
     ON proj.ID = site.ProjectID 
     AND proj.CustomerID = 8 -- Move this to appropriate table 
     AND proj.Type = 1 --Move this to appropriate table assumed it was on proj 
    INNER JOIN tblMEP_CustomerAccounts custAcc 
     ON custAcc.AccountNumber = aps.Account 
     AND custAcc.CustomerID = @CustomerID 
     AND custAcc.UtilityCompanyID = @UtilityCompanyID 
WHERE aps.INV_DATE > DATEADD(month, -6, getdate()) 
) data 
WHERE 
    data.row = 1 
2

如果您正在使用至少SQL-Server 2005中您可以使用排序功能,如ROW_NUMBER在CTE:

WITH CTE AS(
    SELECT [SERV_ACCT], [ACCOUNT], [INV_DATE], 
    RN = ROW_NUMBER() OVER (PARTITION BY SERV_ACCT ORDER BY INV_DATE DESC) 
    FROM dbo.Table1 
) 
SELECT [SERV_ACCT], [ACCOUNT], [INV_DATE] 
FROM CTE 
WHERE RN = 1 

DEMO

+0

对于我的代码,你在哪里添加这段代码?我真的不确定。谢谢。 –

+0

您可以将完整的查询添加到类似于子查询的cte。重要的部分是row_number和分区,每个Serv_Acct的最新记录返回一个分区。 –