Sql 根据计数选择最大值
如何根据firmid检索每个ValueCount的最大值。我需要这样输出数据 我的代码在下面Sql 根据计数选择最大值,sql,sql-server,Sql,Sql Server,如何根据firmid检索每个ValueCount的最大值。我需要这样输出数据 我的代码在下面 SELECT F.FirmID, F.Name, DL.ValueId, DL.ValueName, count(DL.ValueName) AS ValueCount FROM dbo.Jobs AS J INNER JOIN DimensionValues AS DV ON DV.CrossRef = J.JobId INNER JOIN dbo.DimensionLists AS
SELECT
F.FirmID,
F.Name,
DL.ValueId,
DL.ValueName,
count(DL.ValueName) AS ValueCount
FROM
dbo.Jobs AS J
INNER JOIN DimensionValues AS DV ON
DV.CrossRef = J.JobId
INNER JOIN dbo.DimensionLists AS DL ON
DV.ValueId = DL.ValueId
INNER JOIN Firms AS F ON
F.FirmId = J.ClientFirmId
WHERE
DL.DimensionId = 4
GROUP BY
F.FirmID,
F.Name,
DL.ValueName,
DL.ValueId
这会产生类似于
firmid | value | count
1 1 5
1 2 10
2 3 1
2 1 6
我需要把10和6的记录还给你 编辑:SQL 2005答案已删除
然后你可以将结果放入一个临时表或表变量中,然后做如下操作
SELECT
*
FROM
TempTable
WHERE
ValueCount = (SELECT MAX(ValueCount) FROM TempTable AS Lookup WHERE FirmID = TempTable.FirmID)
或者
如果任何ValueCount与同一个FirmID的另一个ValueCount绑定,则这些将提供多条记录。因此,你可以试试这个
SELECT
*
FROM
TempTable
WHERE
value = (
SELECT TOP 1
value
FROM
TempTable as lookup
WHERE
FirmID = TempTable.FirmID
ORDER BY
ValueCount DESC
)
对于这个问题,您需要生成查询的结果集以确定Max ValueCount,然后需要再次执行查询以仅提取具有Max ValueCount的记录。您可以通过多种方式执行此操作,例如将主查询作为子查询重复,以及在SQLServer2005/2008中使用CTE。我认为使用子查询会有点混乱,并且更喜欢CTE,但是对于SQLServer2000,您没有选择CTE。所以,我用了一个临时表而不是CTE。我运行它一次以获取MaxValueCount并将其保存到一个临时表中,然后再次运行查询并对临时表进行连接以仅获取MaxValueCount记录
create table #tempMax
(
FirmID int,
MaxValueCount int
)
insert #tempMax
SELECT t.FirmID, MAX(t.ValueCount) AS MaxValueCount
FROM (
SELECT F.FirmID, F.Name, DL.ValueId, DL.ValueName
, count(DL.ValueName) AS ValueCount
FROM dbo.Jobs AS J
INNER JOIN DimensionValues AS DV ON DV.CrossRef = J.JobId
INNER JOIN dbo.DimensionLists AS DL ON DV.ValueId = DL.ValueId
INNER JOIN Firms AS F ON F.FirmId = J.ClientFirmId
WHERE DL.DimensionId = 4
GROUP BY F.FirmID, F.Name, DL.ValueName, DL.ValueId) t
SELECT t.FirmID, t.Name, t.ValueID, t.ValueName, t.ValueCount
FROM (
SELECT F.FirmID, F.Name, DL.ValueId, DL.ValueName
, count(DL.ValueName) AS ValueCount
FROM dbo.Jobs AS J
INNER JOIN DimensionValues AS DV ON DV.CrossRef = J.JobId
INNER JOIN dbo.DimensionLists AS DL ON DV.ValueId = DL.ValueId
INNER JOIN Firms AS F ON F.FirmId = J.ClientFirmId
WHERE DL.DimensionId = 4
GROUP BY F.FirmID, F.Name, DL.ValueName, DL.ValueId) t
INNER JOIN #tempMax m ON t.FirmID = m.FirmID and t.ValueCount = m.MaxValueCount
DROP TABLE #tempMax
您应该能够为此使用派生表:
SELECT F.FirmID,
F.Name,
DL.ValueId,
DL.ValueName,
T.ValueCount
FROM Jobs J
INNER JOIN DimensionValues DV
ON DV.Crossref = J.JobID
INNER JOIN DimensionList DL
ON DV.ValueID = DL.ValueID
INNER JOIN Firms F
ON F.FirmID = J.ClientFirmID
--derived table
INNER JOIN (SELECT FirmID, MAX(ValueName) ValueCount FROM DimensionList GROUP BY FirmID) T
ON T.FirmID = F.FirmID
WHERE DL.DimensionId = 4
TBL1和TBL2是您的查询: 挑选* 来自TBL1 哪里
TBL1.ValueCount=从TBL2中选择MAXTBL2.ValueCount,其中TBL2.FIRMID=TBL1.FIRMID您的代码有什么问题?什么不起作用?@Joe Stefanelli它工作正常,但返回所有行。我希望它只返回基于firmid的最大计数的行。该行不可编译。我们正在从一台旧的sql2000服务器迁移数据
SELECT F.FirmID,
F.Name,
DL.ValueId,
DL.ValueName,
T.ValueCount
FROM Jobs J
INNER JOIN DimensionValues DV
ON DV.Crossref = J.JobID
INNER JOIN DimensionList DL
ON DV.ValueID = DL.ValueID
INNER JOIN Firms F
ON F.FirmID = J.ClientFirmID
--derived table
INNER JOIN (SELECT FirmID, MAX(ValueName) ValueCount FROM DimensionList GROUP BY FirmID) T
ON T.FirmID = F.FirmID
WHERE DL.DimensionId = 4