随着我的SQL变得越来越生锈,我正在努力使其正常运行。 我有一个包含多个条目的表,如所附图像所示。 我需要编写一个查询,以便它向我返回条目数的计数。即在这种情况下为7。这是MainID,ItemID,DeviceID和ChannelID的不同组合
感谢您的帮助!
答案 0 :(得分:0)
尝试以下操作:
Select
Count(*)
From
(
Select
Distinct
MainID,
ItemID,
DeviceID,
ChannelID
From
yourtable
)X;
答案 1 :(得分:0)
IF OBJECT_ID('tempdb..#T') IS NOT NULL
BEGIN
DROP TABLE #T
END
CREATE TABLE #T (
MainId INT
,ItemId INT
,DeviceId INT
,ChannelId INT
)
INSERT INTO #T VALUES (1,1,2,1),(1,1,2,2),(1,1,2,3),(1,1,22,0),(1,2,1,1),(1,2,1,2)
,(1,2,1,3),(1,2,2,1),(1,2,2,2),(1,2,2,3),(1,2,3,1),(1,2,3,2),(1,2,3,3),(1,2,4,1)
,(1,2,4,2),(1,2,4,3),(1,2,5,1),(1,2,5,2),(1,2,5,3)
SELECT MainId, ItemId, DeviceId, COUNT(*) as RecordCount
FROM
#T
GROUP BY
MainId, ItemId, DeviceId
SELECT DISTINCT MainId, ItemId, DeviceId
FROM
#T
SELECT *, DENSE_RANK() OVER (ORDER BY MainId, ItemId, DeviceId) as GroupNumber
FROM
#t
正如我之前所述,您遇到困难的原因是您将ChannelId包含在查询中以及其他答案中。如果包含ChannelId,则意味着将有7个以上不同的记录组合。而且,我的原始查询没有返回多于7条记录,它仅返回了7条记录以及该列组合的多少条记录的计数。
我更新了3个示例,其中包括示例数据,我恳请您下次在寻求我们帮助时为他人做这些事情,以便轻松提供DML语句而不是测试用例的图片!
示例1只是将按列分组添加到我的原始查询中,这样您就可以看到我在说什么并且有点疏忽。
示例2是与#1基本相同的区别。
示例3,如果您希望像在其他注释中指定的所有其他数据,则在DBMS支持的情况下,您实际上希望使用窗口函数,但是当然这并不能完美地转换为linq。但是您将需要使用DENSE_RANK()来按所需方式进行分组。
答案 2 :(得分:0)
在查找独特组合时只需使用
即
select distinct MainID, ItemID, DeviceID, ChannelID from Yourtable
答案 3 :(得分:0)
ROW_NUMBER()
可能还有许多其他解决方案。
但是为了加快速度,查询的最佳用途是使用ROW_NUMBER()
。
示例代码 :
select
MainID,
ItemID,
DeviceID,
ChannelID,
ROW_NUMBER() OVER(ORDER BY MainID,ItemID,DeviceID,ChannelID) as COUNT_VAR
from Your_table;
它比GROUP BY
查询要快,因为GROUP BY
使用运行时生成的序列号,其中ROW_NUMBER()
使用SQL Server定义的默认索引。
希望对您有帮助