通过SQL对分区进行计数

时间:2018-11-28 10:58:11

标签: sql sql-server tsql count distinct

我有一张类似的桌子

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()似乎在我的情况。

谢谢您的帮助。

5 个答案:

答案 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

enter image description here

答案 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()