2012-04-11 49 views
0

我正在製作一個程序,我需要對數據庫進行查詢,詢問在給定列中出現頻率最高的字符串。在這個例子中,它的「stringONE」。如何做一個查詢來計算哪一個字符串出現在某一列最多?

---------------------------- 
| ID | Column (string) | 
---------------------------- 
| 1 |  stringONE  | 
---------------------------- 
| 2 |  stringTWO  | 
---------------------------- 
| 3 |  stringONE  | 
---------------------------- 
| 4 |  stringONE  | 
---------------------------- 

現在我需要出現的大部分的字符串的名稱,並把它變成一個可變的字符串,例如:

string most_appeared_string = sql.ExecuteScalar(); 

此外,會發生什麼,如果沒有出現串最多2個或更多個出現相同次數的字符串,如下所示:

---------------------------- 
| ID | Column (string) | 
---------------------------- 
| 1 |  stringONE  | 
---------------------------- 
| 2 |  stringTWO  | 
---------------------------- 
| 3 |  stringTWO  | 
---------------------------- 
| 4 |  stringONE  | 
---------------------------- 

請提前致謝。


@KeithS

你有查詢的SQL服務器版本,因爲我想在那裏當它得到了一些錯誤。以下是我想要精確完成的一個表格示例。

------------------------------------------------ 
| ID | column1 (string) | author (string) | 
------------------------------------------------ 
| 1 |  string-ONE |  John  | 
------------------------------------------------ 
| 2 |  string-TWO |  John  | 
------------------------------------------------ 
| 3 |  string-ONE |  Martin  | 
------------------------------------------------ 
| 4 |  string-ONE |  John  | 
------------------------------------------------ 

SELECT TOP (1) column1, COUNT(*) FROM table WHERE author='John' ORDER BY ID 

它應該返回「string-ONE」,因爲它看起來是作者John的最多(2)次。當試圖在MS-SQL Management Studio中的查詢,雖然,這是我得到的錯誤:

Column 'table.column1' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 

沒關係編輯。謝謝。

+0

聽起來像作業... – KeithS 2012-04-11 14:51:38

+0

它可能是。我是一個noob,在這個學期學習數據庫,我正在家裏做一些個人編程項目,以便學習更多。 – Alternatex 2012-04-11 15:14:56

回答

3

這是一個非常簡單的查詢(在T-SQL至少):

select top 1 Column, Count(*) from Table group by Column order by Count(*) desc 

的ExecuteScalar,通過一個實現細節,將返回字符串值因爲它是結果集中唯一行的第一列,即使有兩列。您也可以使用ExecuteReader來訪問該字符串發生的次數。

+0

謝謝。像魅力一樣工作。 – Alternatex 2012-04-11 16:40:30

1
SELECT max(counted) AS max_counted FROM (
    SELECT count(*) AS counted FROM counter GROUP BY date 
) 

這可能做的伎倆

+0

你永遠不會返回列中最常出現的實際字符串值。 – KeithS 2012-04-11 14:54:42

+0

它的開始,他可以結合它像ORDER BY xxx DESC和極限1 – 2012-04-11 14:57:51

+0

謝謝。這工作。 – Alternatex 2012-04-11 17:15:12

2
select top (1) SomeCol, count(*) as Row_Count 
from YourTable 
group by SomeCol 
order by Row_Count desc 

另外,如果是出現在最沒有字符串,而 2個或更多串出現的次數相同數量,這樣會發生什麼:

在這種情況下,使用上面的查詢,你會得到一個任意行。您可以添加with ties以獲取具有相同最高值的所有行。

select top (1) with ties SomeCol, count(*) as Row_Count 
from YourTable 
group by SomeCol 
order by Row_Count desc 
+0

+1,我從來不知道'有關係'。那很棒。 – gilly3 2012-04-11 16:56:56

+0

你能解釋一下我可以如何將這些多個值放入C#中的不同文本框? – Alternatex 2012-04-11 16:59:46

+0

@ user1200185不是不是。我不做C#。我想你有某種查詢對象執行查詢並返回一個包含多行的數據集。你必須遍歷C#中的行並分配你的變量。 – 2012-04-11 17:04:22

相關問題