计算重复的次数1,2或3次

时间:2017-03-24 17:39:16

标签: sql sql-server

我有值

Contractor_Key
--
AAA
BBB
CCC
BBB
CCC
CCC
DDD
CCC

在这个例子中,AAA和DDD只重复一次,这意味着一次重复值的计数是2. BBB重复两次,这里重复两次重复项只是1。 确切的树时间重复值根本没有,我不想输出CCC,因为它重复了3次以上。

我需要计算,我有多少个值,它们重复一次,两次或三次。

我知道这是使用分组的东西,但是没有意识到如何获得理想的结果

4 个答案:

答案 0 :(得分:6)

使用两个级别的聚合:

// Create fake data
ArrayList<Integer> allRows = new ArrayList<Integer>();
for (int i = 0; i < 70; i++)
  allRows.add(i);

System.out.printf("All Data: %s%n", allRows.toString());

// Create 2 Dementional Array
ArrayList<ArrayList<Integer>> twoDRows = new ArrayList<ArrayList<Integer>>();
// Add the 5 rows
for (int i = 0; i < 5; i++)
    twoDRows.add(new ArrayList<Integer>());

// Split allRows
for (int i = 0; i<allRows.size(); i++) {
  int rowToAddTo;

  // Horizontal
  rowToAddTo = i/(allRows.size()/twoDRows.size());

  // Vertical
  rowToAddTo = i%twoDRows.size();

  twoDRows.get(rowToAddTo).add(allRows.get(i));
}

// Pretty-ish print
for (ArrayList<Integer> array:twoDRows)
  System.out.println(array);

我称之为“histogram-of-histgrams”查询。我为每个计数提供了两个密钥示例,供进一步调查。

答案 1 :(得分:5)

SELECT item_repeated_quantity, COUNT(*) FROM (
    SELECT  Contractor_Key, COUNT(*) AS item_repeated_quantity from t group by Contractor_Key HAVING COUNT(*) <= 3
)t
GROUP BY  item_repeated_quantity
ORDER BY item_repeated_quantity

答案 2 :(得分:1)

我认为你想要进行两次聚合 - 首先找到每个contractor_key的计数,然后找到每个count值的计数(在第一次聚合中找到):

select cnt,
    count(*) as times
from (
    select count(*) cnt
    from your_table
    group by contractor_key
    ) t
group by cnt;

答案 3 :(得分:0)

试试这个

;WITH CTE
AS
(
    SELECT
        Contractor_Key,
        Cnt  = COUNT(1)
        FROM MyTable
            GROUP BY Contractor_Key
)
SELECT
    Cnt,
    COUNT(1)
    FROM CTE