SQL rank / dense_rank以及如何使用结果查询/计算

时间:2014-04-04 00:34:15

标签: sql rank

所以我有一个表格,其中我的行密集。 这是表格:

COL1  | COL2  | COL3  | DENSE_RANK |

  a   |   b   |   c   |       1    |
  a   |   s   |   r   |       1    |
  a   |   w   |   f   |       1    |
  b   |   b   |   c   |       2    |
  c   |   f   |   r   |       3    |
  c   |   q   |   d   |       3    |

所以现在我想选择排名只表示一次的任何行,所以2都是单独的,但不是1或3.我想选择发生这种情况的所有行,但是我该怎么做?

一些想法:

  -COUNT DISTINCT (RANK())
  -COUNT RANK()

但这些都不起作用,有什么想法吗?谢谢,麻烦您了!

快乐的黑客

实际代码:

SELECT events.event_type AS "event", 
       DENSE_RANK() OVER (ORDER BY bw_user_event.pad_id) as rank 
FROM user_event 
WHERE (software_events.software_id = '8' OR software_events.software_id = '14') 
  AND (software_events.event_type = 'install')

2 个答案:

答案 0 :(得分:1)

WITH Dense_ranked_table as (
 -- Your select query that generates the table with dense ranks
)
SELECT DENSE_RANK
FROM Dense_ranked_table
GROUP BY DENSE_RANK
HAVING COUNT(DENSE_RANK) = 1;

我没有SQL Server来测试它。所以请告诉我这是否有效。

答案 1 :(得分:0)

我认为你可以添加一个COUNT(*)OVER(PARTITION BY XXXXX),其中XXXXX就是你在密集排名中所包含的内容。

然后将其包装在公用表表达式中,并选择新计数= 1的位置。

像这个小提琴手: http://sqlfiddle.com/#!6/ae774/1

此处包含的代码:

CREATE TABLE T
(
COL1 CHAR,
COL2 CHAR,
COL3 CHAR
);

INSERT INTO T
VALUES 
('a','b','c'),
('a','s','r'),
('a','w','f'),
('b','b','c'),
('c','f','r'),
('c','q','d');

WITH CTE AS (
  SELECT  COL1 ,
        COL2 ,
        COL3, 
        DENSE_RANK() OVER (ORDER BY COL1) AS DR,
        COUNT(*) OVER (PARTITION BY COL1) AS C
FROM dbo.T AS t

 )
SELECT COL1, COL2, COL3, DR
FROM CTE 
WHERE C = 1

只返回

b, b, c, 2 

测试数据中的一行。