IT Staff

Blog về chuyên ngành IT

Truy vấn dữ liệu duy nhất theo điều kiện

leave a comment »

Câu hỏi: Làm sao để hiển thị duy nhất từng furniture từ table này?

Cách thông thường mà tôi nghĩ ngay đến là dùng DISTINCT hoặc GROUP BY. Tuy nhiên, không phải tất cả vấn đề đều phải giải quyết được bằng DISTINCT hoặc GROUP BY.

Ví dụ, người dùng muốn lấy chỉ những record sau cùng nhất của furniture đó để hiển thị, xem hình bên dưới:

Người dùng muốn loại bỏ những records trùng và cũng như hiển thị record theo giá cao nhất.
Tất nhiên có rất nhiều cách để giải quyết yêu cầu đặt ra này, tuy nhiên tôi biết một cách đơn giản để giải quyết nhanh gọn vấn đề này, đó là sử dụng hàm ROW_NUMBER.

Tạo một table ví dụ như sau:

use TempDB

go

create table Furniture(ID int, product varchar(100), price int, color varchar(100))

go

insert into Furniture

select 1, ‘Tivi Stand’, 100, ‘White’

union ALL

select 2, ‘Sofa’, 100, ‘Brown’

union ALL

select 3, ‘Wardrobe’, 100, ‘Walnut’

union ALL

select 4, ‘Wardrobe’, 100, ‘Black’

union ALL

select 5, ‘Wardrobe’, 200, ‘Brown’

union ALL

select 6, ‘Room Divider’, 300, ‘Java’

union ALL

select 7, ‘Room Divider’, 400, ‘Lemon Tree’

go

Truy vấn lấy dự liệu có trong table Furniture:

select product, price, color

from Furniture

go

product

price

color

Tivi Stand

100

White

Sofa

100

Brown

Wardrobe

100

Walnut

Wardrobe

100

Black

Wardrobe

200

Brown

Room Divider

300

Java

Room Divider

400

Lemon Tree

Truy vấn lấy dữ liệu với giá cao nhất:

select product, price, color

from

  (

    select Furniture.*,

      ROW_NUMBER() over (partition by product order by price desc)

      as RN

      from Furniture       

  ) as t

where RN=1

order by id

go

Product

Price

Color

Tivi Stand

100

White

Sofa

100

Brown

Wardrobe

200

Brown

Room Divider

400

Lemon Tree

Trả lại trạng thái ban đầu cho tempdb:

drop table Furniture

go

Tech notes:

Sự khác nhau giữa GROUP BY và PARTITION BY

group by thay đổi toàn bộ câu truy vấn, ví dụ:

select product, count(*) as order_count

from Furniture

group by product

product

order_count

Room Divider

2

Sofa

1

Tivi Stand

1

Wardrobe

3

Nhưng với partition by, nó chỉ làm việc dựa trên một hàm nào đó, ví dụ như hàm row_number:

select product, row_number() over (partition by product order by price desc)

as RN

FROM Furniture

product

RN

Room Divider

1

Room Divider

2

Sofa

1

Tivi Stand

1

Wardrobe

1

Wardrobe

2

Wardrobe

3

trong đó, row_number (tsql) trả về số thứ tự của dòng trong phần dữ liệu đang xét, dòng đầu tiên sẽ bắt đầu bằng 1.

Thường thì một group by sẽ làm giảm số lượng dòng trả về bằng cách xào nấu chúng thông qua việc tính trung bình, tính tổng của từng dòng. Còn partition by không làm ảnh hưởng đến số lượng dòng trả về, nhưng nó thay đổi dựa trên kết quả xử lý của hàm.

select product

Written by Xavier

Tháng Tám 3, 2013 lúc 9:53 sáng

Posted in MSSQL

Tagged with

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s

%d bloggers like this: