Đánh số thứ tự bản ghi trong SQL Server

Trong rất nhiều trường hợp, bạn muốn đánh số thứ tự các bản ghi của kết quả câu truy vấn trong SQL theo  một hoặc một số tiêu chí nào đó nhằm mục đích trình bày cũng như xử lý dữ liệu được trực quan hoặc dùng vào nhiều mục đích khác nhau.

Một số ví dụ như sau:

Ví dụ 1: Đánh số thứ tự tăng dần:

Ví dụ 2: Đánh số thứ tự tăng dần theo nhóm, ở đây là đánh số thứ tự tăng dần của các huyện theo tỉnh


Ví dụ 3: Đánh số giống nhau cho nhóm, ở đây là đánh số giống nhau cho nhóm tỉnh, Nghệ An là 1, Bình Dương đánh số 2, Đồng Nai số 3…


Thực hiện
Cách thực hiện là rất đơn giản. Trước hết hãy tạo table và insert một số dữ liệu như script sau:
— tạo bảng
create table District
(
      DistrictName nvarchar(50),
      ProvinceName nvarchar(50)    
)
GO
— Insert dữ liệu
insert District (DistrictName, ProvinceName) values(N’Nam đàn’,N’Nghệ An’)
insert District (DistrictName, ProvinceName) values(N’Nam đàn’,N’Nghệ An’)
insert District (DistrictName, ProvinceName) values(N’Hưng Nguyên’,N’Nghệ An’)
insert District (DistrictName, ProvinceName) values(N’Thanh Chương’,N’Nghệ An’)
insert District (DistrictName, ProvinceName) values(N’Dĩ An’,N’Bình Dương’)
insert District (DistrictName, ProvinceName) values(N’Thuận An’,N’Bình Dương’)
insert District (DistrictName, ProvinceName) values(N’Bến Cát’,N’Bình Dương’)
insert District (DistrictName, ProvinceName) values(N’Thống Nhất’,N’Đồng Nai’)
insert District (DistrictName, ProvinceName) values(N’Trảng Bom’,N’Đồng Nai’)
insert District (DistrictName, ProvinceName) values(N’Biên Hòa’,N’Đồng Nai’)
— Xem nội dung
của bảng
select * from District

1. Để cho kết quả như ví dụ 1 ở trên, chúng ta chạy câu lệnh như sau:

select IDENTITY(int, 1,1) as STT, DistrictName, ProvinceName
      into #Temp
      from District

select * from #Temp



Kết quả:

Lưu ý: hàm IDENTITY chỉ dùng được với bảng tạm, đó là lý do tại sao ở câu query trên chúng ta phải có bảng tạm #Temp như trên.

Cách thứ hai cũng cho kết quả như trên nhưng không phải dùng bảng tạm đó là chúng ta dùng hàm ROW_NUMBER như sau:

select ROW_NUMBER() over (order by (select 1)) as STT,
            DistrictName,
ProvinceName
      from District

2. Để cho kết quả sắp xếp bản ghi như ví dụ 2 ở trên, chúng ta chay câu lệnh sau:
Cũng dùng hàm ROW_NUMBER như ở ví dụ 1, nhưng có thêm mệnh đề partition by ProvinceName như sau:

select ROW_NUMBER() over (partition by
ProvinceName order by (select 1)) as STT,
            DistrictName,
ProvinceName

      from District

Kết quả:


3. Để có kết quả như ví dụ 3, ta dùng hàm DENSE_RANK như sau:


select DENSE_RANK() over (order by ProvinceName) as STT,
            DistrictName,
ProvinceName

      from District

Kết quả:


Nguồn: Big Data


No Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

SQL Server
1
Clustered Index và Non-Clustered Index là gì?

Index trong SQL Server là một cấu trúc dữ liệu được lưu trữ trên ổ cứng tương ứng với một table hoặc view nhằm mục đích tăng tốc độ việc truy xuất dữ liệu từ table hoặc view đó. Một index chứa các keys được xây dựng từ một hoặc …

SQL Server
Hàm thông dụng trong SQL Server – Phần 1: Hàm ngày tháng (1)

Loạt bài này giới thiệu các hàm và cách sử dụng các hàm thông dụng trong SQL Server, cũng như ví dụ cụ thể đi kèm để giúp người đọc, đặc biệt là những người mới làm quen với SQL Server tiếp cận dễ dàng. Những hàm này cũng là …

SQL Server
Hàm thông dụng trong SQL Server – Phần 1: Hàm ngày tháng (2)

Tiếp theo phần 1 của hàm ngày tháng trong SQL Server, phần này giới thiệu riêng thêm một hàm trong nhóm hàm ngày tháng đó là hàm DATEADD(). Hàm DATEADD trong SQL Server  Hàm này có cấu trúc như sau: DATEADD (datepart , number , date ) –          Trong đó …