Truy vấn SQL lấy danh sách TOP2 (lớn nhất) theo điều kiện

Liên hệ QC

Đình Phán

Thành viên thường trực
Tham gia
23/11/10
Bài viết
232
Được thích
68
Giới tính
Nam
Nghề nghiệp
kt
Chào các anh, chị

Nhờ anh, chị giúp đỡ câu lệnh SQL để lấy danh sách Top2 (lớn nhất) theo từng mã.
Chi tiết theo file đính kèm.
Nếu tìm theo từng mã thì em đã làm được, nhưng em muốn ra nhiều mã cùng nhau.

select Top 2 MA, TEN, TIEN
from Table1
where MA = "A"
order by TIEN desc;

Em cảm ơn.
 

File đính kèm

  • Vi du.xlsx
    9 KB · Đọc: 12
Bạn cho biết nếu lấy TOP 1 thì bạn làm thế nào.

Muốn lấy N tops thì trước tiên phải biết cách truy vấn nội hệ (correlation) để lấy Top 1 đã.
 
Bạn cho biết nếu lấy TOP 1 thì bạn làm thế nào.

Muốn lấy N tops thì trước tiên phải biết cách truy vấn nội hệ (correlation) để lấy Top 1 đã.
Thực sự là em không biết cách làm như anh nói với SQL. Em chỉ làm được với từng mã, sau nối lại với nhau.
Còn lấy MAX kiểu TOP1 thì em có thể dùng Pivot Table để lấy.

Em hỏi thêm là có thể viết thế này không?
Select TOP2 Ma, Ten, Tien
From Table1
Where ma in (select distinct ma from Table1)
Order by Tien Desc;
 
Correlation tôi chỉ vài lần rồi. Nếu bạn không biết tìm hiểu cái này thì không nên nói chuyện tóp tiếc chi cho mất công.
Nếu muốn lấy Top 1 (max) thì dễ dàng.
Muốn lấy thêm nữa thì loại max ra và so sánh với max kế.

Select TOP 2 .... thì cũng chỉ lấy ra 2 dòng trong tổng số các records :)
Top 2 có nghĩa là gì? Là 2 values (giá trị) lớn nhất hay là 2 records đứng đầu?
Nhiều người nói chuyện CSDL LH mà không có khái niệm "đồng hạng".
Phân tích "top" mà không có khái niệm này thì kết quả chả đáng tin cậy.
 
Nhờ anh, chị giúp đỡ câu lệnh SQL để lấy danh sách Top2 (lớn nhất) theo từng mã.
Chi tiết theo file đính kèm.
Nếu tìm theo từng mã thì em đã làm được, nhưng em muốn ra nhiều mã cùng nhau.

select Top 2 MA, TEN, TIEN
from Table1
where MA = "A"
order by TIEN desc;

Em cảm ơn.

Tôi thì dùng một trong 2 cách sau, đều dùng Sub query nhưng cách này sẽ bị ảnh hưởng tốc độ đối với CSDL lớn. Do đó nên lọc dữ liệu trước khi chạy để giảm tải.

- Cách 1:
SQL:
SELECT Table1.MA, Table1.TEN, Table1.TIEN
FROM Table1
WHERE Table1.[TIEN] In (SELECT TOP 2 A.TIEN
    FROM Table1 AS A
    WHERE A.MA = Table1.MA
    ORDER BY TIEN DESC
);

- Cách 2: gán số thứ tự cho từng nhóm rồi chọn 2.

SQL:
SELECT MA, TEN, TIEN
FROM Table1 AS T
WHERE (SELECT COUNT(*)+1 FROM Table1 WHERE T.MA = MA AND T.[TIEN]<[TIEN])  <=2
ORDER BY MA, TIEN DESC;
 
Tôi thì dùng một trong 2 cách sau, đều dùng Sub query nhưng cách này sẽ bị ảnh hưởng tốc độ đối với CSDL lớn. Do đó nên lọc dữ liệu trước khi chạy để giảm tải.
....
Những loại phân tích tùy thích thế này đi ngược với chuẩn CSDL LH.
Ra được kết quả là tốt rồi, ở đấy mà đòi hỏi tốc độ.

Chú thích: tùy theo có kể "đồng hạng" hay không mà có thể phải dùng thêm từ khóa DISTINCT

Chú thích 2:
Loại phân tích dở dở ương ương này bắt buộc phải dùng thuật toán tổng hợp và thống kê qua VBA.
Bất cứ giải pháp nào khác đều là gượng ép. Chúng chỉ thỏa mãn tự ái người viết code SQL là "tôi có thể làm được".
 
Tôi thì dùng một trong 2 cách sau, đều dùng Sub query nhưng cách này sẽ bị ảnh hưởng tốc độ đối với CSDL lớn. Do đó nên lọc dữ liệu trước khi chạy để giảm tải.

- Cách 1:
SQL:
SELECT Table1.MA, Table1.TEN, Table1.TIEN
FROM Table1
WHERE Table1.[TIEN] In (SELECT TOP 2 A.TIEN
    FROM Table1 AS A
    WHERE A.MA = Table1.MA
    ORDER BY TIEN DESC
);

- Cách 2: gán số thứ tự cho từng nhóm rồi chọn 2.

SQL:
SELECT MA, TEN, TIEN
FROM Table1 AS T
WHERE (SELECT COUNT(*)+1 FROM Table1 WHERE T.MA = MA AND T.[TIEN]<[TIEN])  <=2
ORDER BY MA, TIEN DESC;
Cảm ơn anh Ongke0711,

Đúng là lần nào em đưa ra tình huống cũng đều bị các anh bắt bài. Thực chất em muốn là tìm ra những Mã đối tượng có giá trị > 10% tổng giá trị của mã đó. Nhưng với SQL em vẫn gà mờ lắm, thành thử quay sang bài tìm Top2 sau khi đã sắp xếp.
Hôm qua sau gợi ý của anh VetMini thì em cũng thử bằng cách

SQL:
SELECT MA, TEN, TIEN
FROM TABLE1 AS A
WHERE TIEN >
                           0,1 * (SELECT SUM(TIEN) FROM TABLE1
                            WHERE MA = A.MA GROUP BY MA);
 
Thực chất em muốn là tìm ra những Mã đối tượng có giá trị > 10% tổng giá trị của mã đó. Nhưng với SQL em vẫn gà mờ lắm, thành thử quay sang bài tìm Top2 sau khi đã sắp xếp.
Hôm qua sau gợi ý của anh VetMini thì em cũng thử bằng cách

SQL:
SELECT MA, TEN, TIEN
FROM TABLE1 AS A
WHERE TIEN >
                           0,1 * (SELECT SUM(TIEN) FROM TABLE1
                            WHERE MA = A.MA GROUP BY MA);
Đúng là bó tay với bạn!!!
Nhu cầu thực tế một đằng, gửi yêu cầu lên diễn đàn một nẻo, thật là mất công...
Bài đã được tự động gộp:

Loại phân tích dở dở ương ương này bắt buộc phải dùng thuật toán tổng hợp và thống kê qua VBA.
Bất cứ giải pháp nào khác đều là gượng ép. Chúng chỉ thỏa mãn tự ái người viết code SQL là "tôi có thể làm được".
Không hiểu ý bác vấn đề này
Đối với CSDL QH, bài toán "Select Top N records for each Category" dùng câu lệnh SQL rất phổ biến mà bác bảo là phải dùng thuật toán tổng hợp và thống kê qua VBA à???
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom