选择带有很多其他项目的Max

时间:2016-07-29 20:42:47

标签: sql-server max

对不起的头衔感到抱歉。我不知道如何描述我的问题。我写了一个返回大约23,000条记录的查询。很多这些记录都有类似的信息,我只想选择具有最大字段dbo.tblMsgsOnAir_Type8.fldBuddyLinkSigStrength的记录。我已尝试按所选的所有其他列进行分组,但它似乎无法正常工作。我不完全理解SQL,尤其是max和group函数。当我只想要或需要选择一件事时,我可以做简单的最大功能。当我想要选择一堆其他数据时,我不明白它是如何工作的。以下是查询。

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

3 个答案:

答案 0 :(得分:1)

可能row_number()救援。您可以使用它来查找集合中的最佳记录,并通过某个子集或其他子集进行分组。像

这样的东西
select * 
from ....
where row_number over (partition by id order by fldBuddyLinkSigStrength) = 1

因此,SQL Server会在组中分配行号。在这种情况下,每个记录将按ID进行子分组,如果它是最佳强度,则给定1,如果是下一个,则给出2,等等。

答案 1 :(得分:0)

如果你有重复项,你是否尝试过使用SELECT DISTINCT?

基本上Max的工作原理是它会选择组中的最高值。

所以,如果你有一张桌子:

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

并且

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

您将获得每个ID的最大值

ID    |  VALUE
1      |  10
2      | 8

如果您想在不对结果进行分组的情况下获取Max,则可以在子选择中执行该组

SELECT ID,VALUE,MAX_VALUE等 FROM TABLE JOIN(SELECT ID,MAX(VALUE)AS MAX_VALUE FROM TABLE GROUP BY ID)as MAX ON MAX.ID = TABLE.ID

答案 2 :(得分: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上的联接才能获取该表中的列,这样就可以超出您的第一个查询所做的一个额外的左连接。顺便说一句,在这里发布代码是一个好主意,因此它是可读的;它让其他人更容易理解。