2017-07-23 33 views
0

我有一個表如下。按id編組,如果count(item)> 1,則過濾等於65或66的數據。如果count(item)= 1,則不執行任何操作。我們可以使用分析功能來做到這一點,或者實現這一目標的最佳方式是什麼?分組方式和過濾器

+----+------+ 
| Id | Item | 
+----+------+ 
| 1 | 65 | 
+----+------+ 
| 1 | 66 | 
+----+------+ 
| 1 | 01 | 
+----+------+ 
| 2 | 93 | 
+----+------+ 
| 3 | 11 | 
+----+------+ 
| 3 | 12 | 
+----+------+ 

輸出:

+----+------+ 
| Id | Item | 
+----+------+ 
| 1 | 65 | 
+----+------+ 
| 1 | 66 | 
+----+------+ 
| 2 | 93 | 
+----+------+ 
+1

到目前爲止您嘗試過了什麼? –

+0

你是什麼意思「以65或66開頭」? –

+0

從表格組中選擇編號(item)> 1的編號。結果將與實際表格相結合,只有65和64個項目。 – Deek

回答

0

是:

select id, item 
from (select t.*, count(*) over (partition by id) as cnt 
     from t 
    ) t 
where cnt > 1 and item in (65, 66) or cnt = 1; 

如果item是一個字符串,你想前兩個字符爲65或者66,然後是這樣的:

select id, item 
from (select t.*, count(*) over (partition by id) as cnt 
     from t 
    ) t 
where cnt > 1 and regexp_like(item, '^(65|66)') or cnt = 1; 
+0

我認爲它應該是''(65 | 66)'',用於'(65','66')'中的前兩個字符*或更好'substr(item,1,2)',但是我看到OP有現在刪除了「開始」的事情。 – GurV

+0

這工作。謝謝:) – Deek

+0

如果我有相同的ID和項目,我將如何修改?在上面的例子中說,id = 1和item = 01重複兩次,只應得到一個 – Deek

0

試試這個

SELECT 
    r.Id, 
    r.Item, 
    t1.count 
FROM 
results r 
INNER JOIN 
(
    SELECT 
     Id, 
     Count(Id) as count 
    FROM 
    results 
    GROUP BY Id 
) t1 ON t1.Id = r.ID 
WHERE r.Item IN (65, 66) OR t1.count = 1;