2013-07-15 50 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的最新記錄返回一個分區。 –