2014-04-04 47 views
1

所以我有一個表,它的dense_ranks我的行。 下面是表:SQL排名/ dense_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') 
+1

這是哪種RDBMS? SQL Server? – Szymon

+1

不相關,但是:如果'software_id'是一個數字,您不應該將其與字符串值進行比較。 ''8'是一個字符串,'8'是一個數字。並且:如果您的SQL代碼中的列與您的(模糊處理的)示例表的列不匹配,那麼這並沒有什麼幫助。 –

回答

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來進行測試。所以請讓我知道這是否有效。

+0

這不起作用,因爲我只在select語句中排名,所以要使用我的排名,我只在我的選擇中創建的將不會在下面工作,我想。你怎麼看? – mathpun

+0

你是說你的密集隊伍沒有存儲,但是在運行時計算出來? –

+0

也許,我是否應該在我的select語句中使用dense_rank?有可能做別的地方嗎? – mathpun

0

我認爲你可以添加一個COUNT(*)OVER(分區由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 

從您的測試數據中的行。

+0

對不起,你能解釋一下,但'C'部分是做什麼的。我做了我的代碼如下:'SELECT distinct pad_id,c,dr,url FROM (SELECT url,pad_id, DENSE_RANK()OVER(ORDER BY url)AS DR, COUNT(*)OVER(PARTITION BY url)AS C FROM user_event)CTE WHERE C> 1 LIMIT 100' – mathpun