2010-07-08 23 views
6

Tôi muốn trả lại 10 từ phổ biến nhất từ ​​một truy vấn trong SQL server, vì vậy chạy chống lại một tập hợp các hàng như thế này:Làm thế nào bạn có thể nhận được n từ phổ biến nhất trong một tập hợp nhiều hàng được trả về trong truy vấn SQL Server?

cáo nâu nhanh chóng
chậm fox vàng
chậm fox xanh

sẽ trở
fox
chậm
nhanh
nâu
vàng
màu xanh lá cây

+1

Funny bạn nên đề cập đến điều đó ... Xem http://stackoverflow.com/questions/3169051/code-golf-word-frequency-chart/3173246#3173246 – Gabe

+0

Ooh, đó là hoàn hảo. Cảm ơn! Bạn nên thêm điều đó làm câu trả lời .. –

Trả lời

1

Để xem làm thế nào để làm điều này khai báo (tức là không một vòng lặp while), xem câu trả lời tôi đã làm (trên một sân gôn mã của tất cả mọi thứ): Build an ASCII chart of the most commonly used words in a given text

Lưu ý rằng mã t liên kết được thiết kế để có các ký tự ít nhất có thể, không thể đọc được. Vui lòng sử dụng nhiều tên mô tả hơn, ít nhất.

3

Tôi sẽ thử chạy một chức năng tách (tách từng từ thông qua một khoảng trống) trên mỗi hàng được trả lại để nhận tất cả các từ riêng biệt vào một bảng quen thuộc. Sử dụng mã sau, bạn sẽ có thể chia một hàng theo không gian của nó:

CREATE FUNCTION dbo.Split(@String varchar(8000), @Delimiter char(1))  
returns @temptable TABLE (items varchar(8000))  
as  
begin  
    declare @idx int  
    declare @slice varchar(8000)  

    select @idx = 1  
     if len(@String)<1 or @String is null return  

    while @idx!= 0  
    begin  
     set @idx = charindex(@Delimiter,@String)  
     if @idx!=0  
      set @slice = left(@String,@idx - 1)  
     else  
      set @slice = @String  

     if(len(@slice)>0) 
      insert into @temptable(Items) values(@slice)  

     set @String = right(@String,len(@String) - @idx)  
     if len(@String) = 0 break  
    end 
return  
end 

Bạn nên gọi hàm này từ bên trong con trỏ hoặc một cái gì đó; bên trong nó, chỉ cần sử dụng một cái gì đó như:

insert into #tmp (word) select * from dbo.split(' ', @row) 

Cuối cùng, bạn sẽ chỉ phải sử dụng một truy vấn đơn giản như:

select top 10 count(*) as number, word from separated_words_table order by number 

Source here

1

Cách khác. ("Mượn" từ here)

WITH Sentences AS 
(
SELECT 'quick brown fox' AS Sentence UNION ALL 
SELECT 'slow yellow fox' UNION ALL 
SELECT 'slow green fox' 
), 
Xmlified AS 
(
    SELECT 
     CAST('<M>' + REPLACE(Sentence,' ','</M><M>') + '</M>' AS XML) AS xSentence 
FROM Sentences 
), 
Words AS 
(
SELECT 
Split.a.value('.', 'VARCHAR(100)') AS word 
FROM Xmlified 
CROSS APPLY xSentence.nodes('/M') Split(a) 
) 
SELECT COUNT(*) AS C, word FROM Words 
GROUP BY word 
ORDER BY C DESC 
+0

Điều này thật tuyệt vời nhưng nó bị nghẹt thở và ký hiệu cho tôi. Tôi đã giải quyết nó bằng cách thay thế chúng đầu tiên trong câu như 'CAST ('' + REPLACE (REPLACE (Câu, '&', 'amp;'), '', '') + '' AS XML) AS xSentence' – shanabus

+1

@shanabus nếu bạn sử dụng 2016 thay vì https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql –

Các vấn đề liên quan