chỉ nhận các hàng có giá trị nhóm tối đa


8

ví dụ: chúng ta có:

element | group_value | value
a       | 1           | 2000
a       | 2           | 1500
a       | 2           | 2500
b       | 1           | 1000

Tôi chỉ muốn trả lại 3 bản ghi cuối cùng vì đó là những bản ghi có giá trị nhóm tối đa cho mỗi phần tử.

Tôi biết một giải pháp với truy vấn con nhưng có một giải pháp hiệu quả không?

Để làm rõ: đối với phần tử 'a':

2 là nhóm_value cao nhất vì vậy nó trả về hàng 2 và 3> (và không phải hàng đầu tiên vì giá trị nhóm của nó không cao nhất),

cho phần tử 'b':

1 là> nhóm_value cao nhất để nó trả về hàng 4

Giải pháp (hiệu suất không tốt) của tôi cho vấn đề là:

select * 
from   x x1 
where (element, group_value) in (select   element, max(group_value) 
                                 from     x x2 
                                 where    x1.element = x2.element 
                                 group by x2.element)

vui lòng thêm một lược đồ bảng
McNets

6
Làm thế nào là truy vấn hiện tại của bạn không hiệu quả?
dezso

Câu hỏi này đã có tất cả các loại câu trả lời với hiệu suất khác nhau trên SO: stackoverflow.com/questions/586781/
mẹo

Câu trả lời:


12

Câu trả lời đầu tiên sử dụng CTE để chọn max (group_value) và sau đó nối với bảng.

with maxgv as 
(
    select element, max(group_value) maxg
    from x
    group by element
)
select x.element, x.group_value, x.value
from   maxgv
inner join x
on         x.element = maxgv.element
and        x.group_value = maxgv.maxg
;

Cái này sử dụng hàm RANK ():

with grp as 
 (
     select element, group_value, value,
            rank() over (partition by element order by element, group_value desc) rn
     from x
)
select element, group_value, value
from   grp
where  rn = 1;

Cả hai trả về cùng một kết quả:

| element | group_value | value |
|---------|-------------|-------|
| a       | 2           | 1500  |
| a       | 2           | 2500  |
| b       | 1           | 1000  |

Rextester ở đây

Nhưng, chỉ để kiểm tra và so sánh hiệu suất, chúng ta cần lược đồ bảng. Tôi không biết chỉ mục nào đang sử dụng truy vấn hiện tại của bạn.


trong trường hợp này, nó sẽ trả về tất cả các bản ghi là 3 cho "b" và 2 cho "a" là các giá trị nhóm cao cho "b" và "a" và không giới hạn ở 3 nó có thể trả về n bản ghi, chỉ những bản ghi đó nằm trong nhóm giá trị tối đa cho thành phần cụ thể
spuppis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.