sql - 查询的正确排序依据

标签 sql sql-server sql-order-by

鉴于以下情况:

Create Table Person
(
     ID         int ,
     Lastname   varchar(32),
     Firstname  varchar(32)
);

Create Table Families
(
     ID int,
     PersonId_fk int,
     IsHeadOfHousehold bit
);

Insert into Person Values(1, 'Smith', 'John');
Insert into Person Values(4, 'Johnson', 'Sue');
Insert into Person Values(2, 'Smith', 'Jane');
Insert into Person Values(3, 'Towmater', 'Billy');

Insert into Families Values(1, 1, 1);
Insert into Families Values(1, 2, 0);
Insert into Families Values(1, 3, 0);
Insert into Families Values(1, 4, 0);

我无法按以下顺序显示结果。我想做的是让户主首先出现,然后是任何同姓的人,最后是其他人按姓氏排序

Smith     John      1
Smith     Jane      0
Johnson   Sue       0
Towmater  Billy     0

我已经尝试过了

SELECT LastName, FirstName, IsHeadOfHousehold
FROM families f
join person p
on f.PersonID_fk = p.ID
where f.Id = 1
Order by IsHeadOfHousehold DESC, LastName, FirstName

这让我很接近,但没有得到我想要的。

最佳答案

由于您使用的是 SQL Server,如果您使用的是 2005+,您应该能够使用 row_number() 对数据进行排序:

SELECT LastName, FirstName, IsHeadOfHousehold
FROM families f
join person p
  on f.PersonID_fk = p.ID
where f.Id = 1
order by IsHeadOfHousehold desc, 
  row_number() over(partition by lastname order by IsHeadOfHousehold desc) desc, 
  lastname, firstname;

参见SQL Fiddle with Demo

关于sql - 查询的正确排序依据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16591047/

相关文章:

sql - 为什么此查询失败并显示 "Cannot convert a char value to money. "

mysql - select 语句将 null 存储在变量中

java - Arraylist 中的子列表与 SQL 中的 limit

.net - 如何确保连接字符串用于本地计算机

sql-server - SQL Server 和 REAL 数据类型的舍入问题

php - MySQL ORDER BY 带系数?

mysql - SQL:按rowID排序,然后根据rowid按列排序

sql - Oracle PL/SQL 中的自定义顺序

MySQL 在大型数据集上使用 IN 更新时速度缓慢

SQL:SELECT DISTINCT 不返回不同的值