对不起的头衔感到抱歉。我不知道如何描述我的问题。我写了一个返回大约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
答案 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上的联接才能获取该表中的列,这样就可以超出您的第一个查询所做的一个额外的左连接。顺便说一句,在这里发布代码是一个好主意,因此它是可读的;它让其他人更容易理解。