所以我有一个表格,其中我的行密集。 这是表格:
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')
答案 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
测试数据中的一行。