2017-08-29 22 views
0

我有一個返回兩個值的查詢。我想擁有最大的價值,所以我做了一組,然後MAX。但是,我有三個其他列(varchar),我希望與使用max引入的id保持一致。使用SQL組同時保持相同的varchar值

例子。

OId  CId FName LName BName 

18477 110 Hubba Bubba whoa 
158  110 Test2 Person2 leee 

我要的是 OID識別符FName參數LName的BNAME

18477 110 Hubba Bubba whoa 

所以我想將它們按識別符。而且,我想保持最大的數字。我無法使用Min或Max作爲FName,LName或BName,因爲我希望它們成爲具有所選OId的那個。我甚至不需要其他行的FName,LName和BName。

我嘗試使用SELECT TOP,但只是從字面上拉一行,我需要多個。

SQL

INSERT INTO #CustomerInfoAll(FName, LName, BName, OwnerId, CustomerId) 
SELECT 
-- what goes here --(o.FirstName) AS FName, 
-- what goes here --(o.LastName) AS LName, 
-- what goes here --(o.BusinessName) AS BName, 
MAX(o.OId) AS OId, 
(r.CId) AS CId 
FROM Owner o 
INNER JOIN Report r 
ON o.ReportId = r.ReportId 
WHERE r.CId IN (SELECT CId FROM #ThisReportAll) 
AND r.Completed IS NOT NULL 
GROUP BY r.CId 
ORDER BY OId DESC; 
+0

什麼版本的SQL Server? – ErikE

+0

我目前使用的SQL Server是2008 R2 –

回答

1

假設你有SQL Server 2005或更高:

INSERT INTO #CustomerInfoAll (FName, LName, BName, OwnerId, CustomerId) 
SELECT 
    FirstName, 
    LastName, 
    BusinessName, 
    Id, 
    CId 
FROM 
    (
     SELECT 
     Seq = ROW_NUMBER() OVER (PARTITION BY r.CId ORDER BY o.Id DESC), 
     o.Id, 
     r.CId, 
     o.FirstName, 
     o.LastName, 
     o.BusinessName 
     FROM 
     dbo.Owner o 
     INNER JOIN dbo.Report r 
      ON o.ReportId = r.ReportId 
     WHERE 
     EXISTS (-- can be INNER JOIN instead if `CId` is unique in temp table 
      SELECT * 
      FROM #ThisReportAll tra 
      WHERE r.CId = tra.CId 
     ) 
     AND r.Completed IS NOT NULL 
     GROUP BY 
     o.Id, 
     r.CId, 
     o.FirstName, 
     o.LastName, 
     o.BusinessName 
    ) x 
WHERE 
    x.Seq = 1; 
  • 確實使用在所有的對象(dbo.Owner和​​)全模式名稱。
  • 儘可能使用半連接(EXISTS子句)或INNER JOIN而不是IN
+0

我曾經告訴過你你是我的英雄! –

+0

嘖嘖,謝謝!我很感激。還有其他方法可以完成它,但我給了你一個體面的。對於*非常大的查詢,還有其他技術可以更好地執行,但這是最直接的方法之一。 – ErikE

相關問題