Hướng dẫn group by range mysql - nhóm theo phạm vi mysql

Giả sử tôi có một bảng với một cột số [hãy gọi nó là "điểm"].

Tôi muốn tạo ra một bảng số lượng, điều đó cho thấy số lần điểm xuất hiện trong mỗi phạm vi.

Ví dụ:

score range  | number of occurrences
-------------------------------------
   0-9       |        11
  10-19      |        14
  20-29      |         3
   ...       |       ...

Trong ví dụ này, có 11 hàng có điểm số trong phạm vi từ 0 đến 9, 14 hàng có điểm trong phạm vi từ 10 đến 19 và 3 hàng có điểm trong phạm vi 20-29.

Có một cách dễ dàng để thiết lập điều này? Bạn đề xuất món gì?

Mitch Wheat

291K42 Huy hiệu vàng458 Huy hiệu bạc533 Huy hiệu đồng42 gold badges458 silver badges533 bronze badges

Hỏi ngày 24 tháng 10 năm 2008 lúc 3:26Oct 24, 2008 at 3:26

Cả hai câu trả lời được bỏ phiếu cao nhất đều không chính xác trên SQL Server 2000. Có lẽ họ đã sử dụng một phiên bản khác.

Dưới đây là các phiên bản chính xác của cả hai trên SQL Server 2000.

select t.range as [score range], count[*] as [number of occurences]
from [
  select case  
    when score between 0 and 9 then ' 0- 9'
    when score between 10 and 19 then '10-19'
    else '20-99' end as range
  from scores] t
group by t.range

hoặc

select t.range as [score range], count[*] as [number of occurrences]
from [
      select user_id,
         case when score >= 0 and score< 10 then '0-9'
         when score >= 10 and score< 20 then '10-19'
         else '20-99' end as range
     from scores] t
group by t.range

Dale k

Phim thương hiệu vàng 23K1414 gold badges42 silver badges70 bronze badges

Đã trả lời ngày 24 tháng 10 năm 2008 lúc 12:01Oct 24, 2008 at 12:01

Ron Tuffinron TuffinRon Tuffin

52,8K24 Huy hiệu vàng64 Huy hiệu bạc76 Huy hiệu đồng24 gold badges64 silver badges76 bronze badges

7

Một cách tiếp cận khác sẽ liên quan đến việc lưu trữ các phạm vi trong một bảng, thay vì nhúng chúng vào truy vấn. Bạn sẽ kết thúc với một bảng, gọi nó là phạm vi, trông như thế này:

LowerLimit   UpperLimit   Range 
0              9          '0-9'
10            19          '10-19'
20            29          '20-29'
30            39          '30-39'

Và một truy vấn trông như thế này:

Select
   Range as [Score Range],
   Count[*] as [Number of Occurences]
from
   Ranges r inner join Scores s on s.Score between r.LowerLimit and r.UpperLimit
group by Range

Điều này có nghĩa là thiết lập một bảng, nhưng sẽ dễ dàng duy trì khi phạm vi mong muốn thay đổi. Không có mã thay đổi cần thiết!

Đã trả lời ngày 25 tháng 10 năm 2008 lúc 12:20Oct 25, 2008 at 12:20

Walter Mittywalter MittyWalter Mitty

17.4K2 Huy hiệu vàng27 Huy hiệu bạc56 Huy hiệu Đồng2 gold badges27 silver badges56 bronze badges

2

Tôi thấy câu trả lời ở đây sẽ không hoạt động trong cú pháp của SQL Server. Tôi sẽ dùng:

select t.range as [score range], count[*] as [number of occurences]
from [
  select case 
    when score between  0 and  9 then ' 0-9 '
    when score between 10 and 19 then '10-19'
    when score between 20 and 29 then '20-29'
    ...
    else '90-99' end as range
  from scores] t
group by t.range

Chỉnh sửa: Xem bình luận

Đã trả lời ngày 24 tháng 10 năm 2008 lúc 4:05Oct 24, 2008 at 4:05

Ken Paulken PaulKen Paul

5.6132 Huy hiệu vàng30 Huy hiệu bạc33 Huy hiệu Đồng2 gold badges30 silver badges33 bronze badges

2

Trong Postgres [trong đó

select t.range as [score range], count[*] as [number of occurrences]
from [
      select user_id,
         case when score >= 0 and score< 10 then '0-9'
         when score >= 10 and score< 20 then '10-19'
         else '20-99' end as range
     from scores] t
group by t.range
1 là toán tử nối chuỗi]:

select [score/10]*10 || '-' || [score/10]*10+9 as scorerange, count[*]
from scores
group by score/10
order by 1

gives:

 scorerange | count 
------------+-------
 0-9        |    11
 10-19      |    14
 20-29      |     3
 30-39      |     2

Đã trả lời ngày 24 tháng 10 năm 2008 lúc 3:41Oct 24, 2008 at 3:41

Mhawkemhawkemhawke

81.8K9 Huy hiệu vàng113 Huy hiệu bạc135 Huy hiệu Đồng9 gold badges113 silver badges135 bronze badges

Câu trả lời của James Curran là ngắn gọn theo ý kiến ​​của tôi, nhưng đầu ra không chính xác. Đối với SQL Server, câu lệnh đơn giản nhất như sau:

SELECT 
    [score range] = CAST[[Score/10]*10 AS VARCHAR] + ' - ' + CAST[[Score/10]*10+9 AS VARCHAR], 
    [number of occurrences] = COUNT[*]
FROM #Scores
GROUP BY Score/10
ORDER BY Score/10

Điều này giả định bảng tạm thời #Scores tôi đã sử dụng để kiểm tra nó, tôi chỉ điền 100 hàng với số ngẫu nhiên trong khoảng từ 0 đến 99.

Đã trả lời ngày 24 tháng 10 năm 2008 lúc 5:54Oct 24, 2008 at 5:54

Timothy Walterstimothy WaltersTimothy Walters

16.8k2 Huy hiệu vàng40 Huy hiệu bạc49 Huy hiệu đồng2 gold badges40 silver badges49 bronze badges

1

create table scores [
   user_id int,
   score int
]

select t.range as [score range], count[*] as [number of occurences]
from [
      select user_id,
         case when score >= 0 and score < 10 then '0-9'
         case when score >= 10 and score < 20 then '10-19'
         ...
         else '90-99' as range
     from scores] t
group by t.range

Đã trả lời ngày 24 tháng 10 năm 2008 lúc 3:32Oct 24, 2008 at 3:32

TVanfossontvanfossontvanfosson

514K97 Huy hiệu vàng695 Huy hiệu bạc793 Huy hiệu Đồng97 gold badges695 silver badges793 bronze badges

1

select t.range as [score range], count[*] as [number of occurences]
from [
  select case  
    when score between 0 and 9 then ' 0- 9'
    when score between 10 and 19 then '10-19'
    else '20-99' end as range
  from scores] t
group by t.range
0

Đã trả lời ngày 24 tháng 10 năm 2008 lúc 3:32Oct 24, 2008 at 3:32

TVanfossontvanfossonJames Curran

514K97 Huy hiệu vàng695 Huy hiệu bạc793 Huy hiệu Đồng35 gold badges179 silver badges255 bronze badges

2

James Curranjames Curran

select t.range as [score range], count[*] as [number of occurences]
from [
  select case  
    when score between 0 and 9 then ' 0- 9'
    when score between 10 and 19 then '10-19'
    else '20-99' end as range
  from scores] t
group by t.range
1

99,8K35 Huy hiệu vàng179 Huy hiệu bạc255 Huy hiệu ĐồngOct 7, 2015 at 19:18

Điều này sẽ cho phép bạn không phải chỉ định phạm vi và phải là SQL Server Agnostic. Toán ftw!trevorgrayson

Đã trả lời ngày 7 tháng 10 năm 2015 lúc 19:181 gold badge20 silver badges29 bronze badges

Trevorgraysontrevorgrayson

select t.range as [score range], count[*] as [number of occurences]
from [
  select case  
    when score between 0 and 9 then ' 0- 9'
    when score between 10 and 19 then '10-19'
    else '20-99' end as range
  from scores] t
group by t.range
2

1.7761 Huy hiệu vàng20 Huy hiệu bạc29 Huy hiệu đồng

Tôi sẽ làm điều này một chút khác nhau để nó chia tỷ lệ mà không phải xác định mọi trường hợp:Nov 25, 2014 at 16:28

Không được kiểm tra, nhưng bạn có ý tưởng ...JoshNaro

Đã trả lời ngày 25 tháng 11 năm 2014 lúc 16:282 gold badges23 silver badges40 bronze badges

select t.range as [score range], count[*] as [number of occurences]
from [
  select case  
    when score between 0 and 9 then ' 0- 9'
    when score between 10 and 19 then '10-19'
    else '20-99' end as range
  from scores] t
group by t.range
3

JoshnarojoshnaroOct 24, 2008 at 3:58

2.0452 Huy hiệu vàng23 Huy hiệu bạc40 Huy hiệu đồngAheho

Đã trả lời ngày 24 tháng 10 năm 2008 lúc 3:5813 gold badges53 silver badges82 bronze badges

select t.range as [score range], count[*] as [number of occurences]
from [
  select case  
    when score between 0 and 9 then ' 0- 9'
    when score between 10 and 19 then '10-19'
    else '20-99' end as range
  from scores] t
group by t.range
4

Ahehoaheho

12.4K13 Huy hiệu vàng53 Huy hiệu bạc82 Huy hiệu đồngMar 30, 2013 at 5:41

Hãy chắc chắn rằng bạn sử dụng một từ khác ngoài 'phạm vi' nếu bạn đang ở trong MySQL hoặc bạn sẽ gặp lỗi khi chạy ví dụ trên.

Đã trả lời ngày 30 tháng 3 năm 2013 lúc 5:41

select t.range as [score range], count[*] as [number of occurences]
from [
  select case  
    when score between 0 and 9 then ' 0- 9'
    when score between 10 and 19 then '10-19'
    else '20-99' end as range
  from scores] t
group by t.range
5

Vì cột được sắp xếp trên [

select t.range as [score range], count[*] as [number of occurrences]
from [
      select user_id,
         case when score >= 0 and score< 10 then '0-9'
         when score >= 10 and score< 20 then '10-19'
         else '20-99' end as range
     from scores] t
group by t.range
2] là một chuỗi, sắp xếp chuỗi/từ được sử dụng thay vì sắp xếp số.

select t.range as [score range], count[*] as [number of occurences]
from [
  select case  
    when score between 0 and 9 then ' 0- 9'
    when score between 10 and 19 then '10-19'
    else '20-99' end as range
  from scores] t
group by t.range
6

Miễn là các chuỗi có số không để giảm độ dài số, việc sắp xếp vẫn phải đúng về mặt ngữ nghĩa:Jul 15, 2014 at 12:18

Nếu phạm vi được trộn, chỉ cần pad thêm một số 0:Kevin Hogg

Đã trả lời ngày 15 tháng 7 năm 2014 lúc 12:1825 silver badges32 bronze badges

Kevin Hoggkevin Hogg

select t.range as [score range], count[*] as [number of occurences]
from [
  select case  
    when score between 0 and 9 then ' 0- 9'
    when score between 10 and 19 then '10-19'
    else '20-99' end as range
  from scores] t
group by t.range
7

1.73125 huy hiệu bạc32 huy hiệu đồng

Thử6 gold badges33 silver badges77 bronze badges

AndreNov 20, 2015 at 15:59

25.4K6 Huy hiệu vàng33 Huy hiệu bạc77 Huy hiệu đồngStubo

Đã trả lời ngày 20 tháng 11 năm 2015 lúc 15:592 bronze badges

1

select t.range as [score range], count[*] as [number of occurences]
from [
  select case  
    when score between 0 and 9 then ' 0- 9'
    when score between 10 and 19 then '10-19'
    else '20-99' end as range
  from scores] t
group by t.range
8

Stubostubo

Phù hiệu bằng đồng 1121 gold badge10 silver badges29 bronze badges

KleashAug 13, 2020 at 9:08

1.1311 Huy hiệu vàng10 Huy hiệu bạc29 Huy hiệu đồng

select t.range as [score range], count[*] as [number of occurences]
from [
  select case  
    when score between 0 and 9 then ' 0- 9'
    when score between 10 and 19 then '10-19'
    else '20-99' end as range
  from scores] t
group by t.range
9

Đã trả lời ngày 13 tháng 8 năm 2020 lúc 9:08Dec 23, 2020 at 18:07

Tôi ở đây vì tôi có câu hỏi tương tự nhưng tôi thấy câu trả lời ngắn gọn và câu hỏi có "trường hợp liên tục khi" là nhiều công việc và thấy bất cứ điều gì lặp đi lặp lại trong mã của tôi làm tổn thương mắt tôi. Vì vậy, đây là giải pháp

select t.range as [score range], count[*] as [number of occurrences]
from [
      select user_id,
         case when score >= 0 and score< 10 then '0-9'
         when score >= 10 and score< 20 then '10-19'
         else '20-99' end as range
     from scores] t
group by t.range
0

Đã trả lời ngày 23 tháng 12 năm 2020 lúc 18:07Jun 26 at 12:55

Đối với Prestosql/Trino áp dụng câu trả lời từ Ken //stackoverflow.com/a/232463/429476Alex Punnen

Đã trả lời ngày 26 tháng 6 lúc 12:552 gold badges53 silver badges64 bronze badges

Alex Punnenalex Punnen

4.4682 Huy hiệu vàng53 Huy hiệu bạc64 Huy hiệu Đồng

Có lẽ bạn đang hỏi về việc giữ những thứ như vậy đang diễn ra ...

Tất nhiên bạn sẽ gọi một lần quét bảng đầy đủ cho các truy vấn và nếu bảng chứa các điểm cần được tính [tập hợp] là lớn, bạn có thể muốn một giải pháp hoạt động tốt hơn, bạn có thể tạo một bảng thứ cấp và sử dụng

select t.range as [score range], count[*] as [number of occurrences]
from [
      select user_id,
         case when score >= 0 and score< 10 then '0-9'
         when score >= 10 and score< 20 then '10-19'
         else '20-99' end as range
     from scores] t
group by t.range
3 - Bạn có thể nhìn vào nó.Oct 24, 2008 at 3:49

Không phải tất cả các động cơ RDBMS đều có quy tắc, mặc dù!Richard T

Đã trả lời ngày 24 tháng 10 năm 2008 lúc 3:495 gold badges35 silver badges46 bronze badges

Bài Viết Liên Quan

Chủ Đề