2016-07-29 121 views
0

對不起,標題不好。我不確定如何描述我的問題。我寫了一個查詢返回約23,000條記錄。很多這些記錄都有類似的信息,我只想選擇最大字段爲dbo.tblMsgsOnAir_Type8.fldBuddyLinkSigStrength的記錄。我嘗試了所有其他列被選中的分組,但它似乎不能正常工作。我不完全理解SQL,特別是最大和組函數。當我只想或需要選擇一件事情時,我可以做簡單的最大功能。我不明白它是如何工作的,當我想選擇一堆其他數據。以下是查詢。選擇最大與其他項目

SELECT 
    dbo.tblmeterinfo.fldMeterSerialNumber AS "MOP_FNP_Meter", 
    dbo.tblMsgsOnAir_Type8.fldRBuddyId AS "MOP_FNP_FNID", 
    dbo.TBLMETERMAINT.fldmeterid AS "Meter_ID_Helped", 
    dbo.tblMsgsOnAir_Type8.fldCBuddyId AS "FNID_Helped", 
    dbo.fn_dt(dbo.tblMsgsOnAir_Type8.fldRBuddyToi) AS "TOI", 
    dbo.tblMsgsOnAir_Type8.fldBuddyLinkSigStrength AS "Sig_Str", 
    dbo.TBLSAWN_CIS_INFO.SML AS "Buddy_SML", 
    dbo.TBLMETERLIST.fldaddress AS "Buddy_Address", 
    dbo.TBLSAWNGISCOORD.X_COORD AS "X_Coord", 
    dbo.TBLSAWNGISCOORD.Y_COORD AS "Y_Coord" 
FROM dbo.tblMsgsOnAir_Type8 
LEFT OUTER JOIN dbo.TBLMETERLIST 
    ON (dbo.TBLMETERLIST.FLDREPID = dbo.tblMsgsOnAir_Type8.fldCBuddyId) 
LEFT OUTER JOIN dbo.TBLMETERMAINT 
    ON (dbo.TBLMETERMAINT.FLDREPID = dbo.tblMsgsOnAir_Type8.fldCBuddyID) 
LEFT OUTER JOIN dbo.TBLSAWN_CIS_INFO 
    ON (dbo.TBLSAWN_CIS_INFO.FLDREPID = dbo.tblMsgsOnAir_Type8.fldCBuddyId) 
LEFT OUTER JOIN dbo.TBLSAWNGISCOORD 
    ON (dbo.TBLSAWNGISCOORD.SRV_MAP_LOC = dbo.TBLSAWN_CIS_INFO.SML) 
LEFT OUTER JOIN dbo.tblmeterinfo 
    ON (dbo.tblmeterinfo.fldRepId = dbo.tblMsgsOnAir_Type8.fldRBuddyId) 
WHERE dbo.tblMsgsOnAir_Type8.fldRBuddyId IN (SELECT 
    dbo.tblSAWN_FNPmap.Repid 
FROM dbo.tblSAWN_FNPmap) 
AND dbo.TBLMETERMAINT.fldmeterid IS NOT NULL 

下面的查詢很簡單,做我想要的,但沒有得到所有其他字段。該查詢只返回617條記錄。我希望上述查詢返回617條記錄,但包含我選擇的所有其他信息。

SELECT 
    dbo.TBLMETERMAINT.fldmeterid AS "Meter_ID_Helped", 
    MAX(dbo.tblMsgsOnAir_Type8.fldBuddyLinkSigStrength) AS "Max_Sig" 
FROM dbo.tblMsgsOnAir_Type8 
LEFT OUTER JOIN dbo.TBLMETERMAINT 
    ON (dbo.TBLMETERMAINT.FLDREPID = dbo.tblMsgsOnAir_Type8.fldCBuddyID) 
WHERE dbo.tblMsgsOnAir_Type8.fldRBuddyId IN (SELECT 
    dbo.tblSAWN_FNPmap.Repid 
FROM dbo.tblSAWN_FNPmap) 
AND dbo.TBLMETERMAINT.fldmeterid IS NOT NULL 
GROUP BY dbo.TBLMETERMAINT.fldmeterid 

回答

0

如果您正在使用SELECT DISTINCT嘗試使用重複項嗎?

Max基本上的工作原理是它將選擇組中的最高值。

所以,如果你有一個表:

ID  | VALUE 
1  | 10 
1  | 7 
1  | 9 
2  | 6 
2  | 8 

,做

SELECT ID,MAX(VALUE) FROM表 GROUP BY ID

你會得到每最大值ID

ID | VALUE 
1  | 10 
2  | 8 

如果你想獲得Max不分組的結果,那麼你可以做的組中的子查詢

SELECT ID,VALUE,MAX_VALUE等等等等 FROM表 JOIN(SELECT ID,MAX(值)MAX_VALUE FROM TABLE GROUP BY ID)爲MAX ON MAX .ID = TABLE.ID

+1

感謝您的建議。我會嘗試修改查詢星期一併回報。我認爲這是有道理的。 – AdamH

0

不知道你的表結構更詳細我不能確定這是最好的方式,但這是應該工作的東西。使用第二個查詢作爲左連接的左側,以拾取額外的列:

select a.* 
    from (<your 2nd query>) a 
left join dbo.TBLMETERLIST 
    on (a.FLDREPID = dbo.tblMsgsOnAir_Type8.fldCBuddyId) 
left join <next table> ... 

等等。您還必須在dbo.tblMsgsOnAir_Type8上留下連接以便獲取該表中的列,這是除第一個查詢所做的更多的左連接。順便說一句,在這裏發佈代碼是一個好主意,因此它是可讀的;它使其他人更容易理解。

+0

對不起,這個醜陋的帖子。我試圖弄清楚如何在代碼格式中包裝查詢,但沒有看到選項。我沒有看到在發佈前預覽帖子的選項。如何在未來格式化查詢? – AdamH

+0

您可以用四個空格前綴每行代碼;當你輸入問題時,它會顯示你的問題,這樣你就可以知道你是否做得對。 –

1

可能row_number()來救援。您可以使用它來查找一組中的最佳記錄,並通過一些子集或其他組進行分組。類似於

select * 
from .... 
where row_number over (partition by id order by fldBuddyLinkSigStrength) = 1 

因此,SQL Server在組內分配一個行號。在這種情況下,每個記錄將按id進行分組,並且如果它是最佳實力,則給予1,如果是下一個,則記錄爲2等。