我试图用最好的方法来解决这个问题,而且我永远无法达到我想要的结果。
我有一张桌子,这里是它的简化版本,没有无用的物品;请原谅可怜的格式:
表ICD
Pin |Direction | Type | Specifics | Channel
1 | output | digital | open/gnd | 1
2 | output | digital | open/gnd | 2
3 | output | digital | open/gnd | 3
4 | output | digital | open/gnd | 4
5 | output | power | open/gnd | 5
6 | output | power | open/gnd | 5
7 | input | digital | gnd | null
8 | input | digital | gnd | null
9 | input | digital | gnd | null
10 | input | digital | gnd | null
11 | output | digital | open/28 | 6
12 | output | digital | open/28 | 7
我想知道 - 计算 - 我有多少种不同类型的信号。这是我用以下查询做的:
SELECT Direction, Type, Specifics, Channel, COUNT(*) AS CountOf
FROM ICDs
GROUP BY Direction, Type, Specifics, Channel
HAVING COUNT(*) > 0
查询结果为:
Direction | Type | Specifics | CountOf
output | digital | open/gnd | 4
output | power | open/gnd | **2**
input | digital | gnd | 4
output | digital | open/28 | 2
此结果的唯一问题是功率输出使用2个引脚(由于高功率)用于同一通道,因此实际上输出功率线应该具有countOf 1而不是2.
output | power | open/gnd | **1**
我尝试做一个子查询并在执行上述查询之前提取所有行,其中Direction,Type,Specifics和Channel为GROUPed,但是这与我的gnd输入的计数混淆,其中没有归因于通道编号。
有任何建议如何调整它以获得所需的结果?我想我应该能够删除重复的通道行,但不能删除那些channel = null然后进行计数的通道行。我无法掌握如何做到这一点。
请注意:表格更大,查询更复杂,但这是我的问题所在。此外,如果重要的话,编码在C#VS2017中完成。
非常感谢任何帮助!
答案 0 :(得分:0)
您可以在子查询中使用DENSE_RANK()
SELECT Direction,Type,Specifics,CountOf=MAX(CountOf)
FROM
(
SELECT *
,CountOf = DENSE_RANK() OVER (PARTITION BY Direction,[Type],Specifics ORDER BY isnull(Channel,pin))
FROM Table1
) AS a
GROUP BY Direction,Type,Specifics
当频道为NULL时,请注意isnull(Channel,pin)
它使用pin。
它适用于样本数据,但可能不适用于您的实际数据,请根据您的实际数据进行调整。
希望它有所帮助