我有一张类似的桌子
col1ID col2String Col3ID Col4String Col5Data
1 xxx 20 abc 14-09-2018
1 xxx 20 xyz 14-09-2018
2 xxx 30 abc 14-09-2018
2 xxx 30 abc 14-09-2018
我想添加一列,该列根据col1ID和col3ID计算col4String组中有多少个不同的字符串。
类似
COUNT(DISTINCT (Col4String)) over (partition by col1ID, col3ID)
但是它不起作用,我收到一个错误消息
OVER子句不允许使用DISTINCT。
消息102,第15级,状态1,第23行。
我有更多列,例如col2String,col5Data,但是它们不应该受到影响,因此我不能在SELECT
的开头使用distinct,并且dense_rank()
似乎在我的情况。
谢谢您的帮助。
答案 0 :(得分:1)
SQL Server的窗口功能显然不支持独特,因此,您可以改用子查询。遵循以下原则:
select (
select COUNT(DISTINCT Col4String)
from your_table t2
where t1.col1ID = t2.col1ID and t1.col3ID = t2.col3ID
)
from your_table t1
答案 1 :(得分:1)
尝试一下:
DECLARE @DataSource TABLE
(
[col1ID] INT
,[col2String] VARCHAR(12)
,[Col3ID] INT
,[Col4String] VARCHAR(12)
,[Col5Data] DATE
);
INSERT INTO @DataSource
VALUES (1, 'xxx', 20, 'abc', '2018-09-14')
,(1, 'xxx', 20, 'xyz', '2018-09-14')
,(2, 'xxx', 30, 'abc', '2018-09-14')
,(2, 'xxx', 30, 'abc', '2018-09-14');
SELECT *
,dense_rank() over (partition by col1ID, col3ID order by [Col4String]) + dense_rank() over (partition by col1ID, col3ID order by [Col4String] desc) - 1
FROM @DataSource
答案 2 :(得分:0)
尝试这种方式;
select * from TableX X
outer apply(select count(*) as stringCount , X2.Col4String
from TableX X2 on X.col1ID= X2.col1ID and X.col3ID = X2.col3ID
group by X2.Col4String ) K
答案 3 :(得分:0)
我会使用APPLY
:
SELECT t.*, t1.Col4String_Cnt
FROM table t CROSS APPLY
(SELECT COUNT(DISTINCT t1.Col4String) AS Col4String_Cnt
FROM table t1
WHERE t1.col1ID = t.col1ID AND t1.col3ID = t.col3ID
) t1;
答案 4 :(得分:0)
您可以使用附加级别的窗口功能来执行此操作。一种方法使用var myArray=[0];
for(var val in myArray){
console.log(val);
debugger;
};
:
dense_rank()