sql-server - SQL 服务器 : select distinct by one column and by another column value

标签 sql-server select sql-order-by distinct

这是一个 SQL Server 表的数据

id   user_id     start_date   status_id    payment_id
======================================================
2      4         20-nov-11         1          5
3      5         23-nov-11         1         245
4      5         25-nov-11         1         128
5      6         20-nov-11         1         223
6      6         25-nov-11         2         542
7      4         29-nov-11         2         123
8      4         05-jan-12         2         875

我需要通过 user_idorder by id asc 获得不同的值,但只有一个具有最高开始日期的 user_id

我需要以下输出:

id   user_id     start_date   status_id    payment_id
======================================================
8      4         05-jan-12         2         875
4      5         25-nov-11         1         128
6      6         25-nov-11         2         542

请帮忙!

什么是 SQL 查询?

最佳答案

您可以在子查询或使用 CTE 中使用 row_number()

子查询版本:

select id, user_id, start_date, status_id, payment_id
from
(
  select id, user_id, start_date, status_id, payment_id, 
    row_number() over(partition by user_id order by start_date desc) rn
  from yourtable
) src
where rn = 1

参见 SQL Fiddle with Demo

CTE 版本:

;with cte as
(
  select id, user_id, start_date, status_id, payment_id, 
    row_number() over(partition by user_id order by start_date desc) rn
  from yourtable
)
select id, user_id, start_date, status_id, payment_id
from cte
where rn = 1

参见 SQL Fiddle with Demo

或者您可以将表连接到自身:

select t1.id, 
  t1.user_id, 
  t1.start_date, 
  t1.status_id, 
  t1.payment_id
from yourtable t1
inner join 
(
  select user_id, max(start_date) start_date
  from yourtable
  group by user_id
) t2
  on t1.user_id = t2.user_id
  and t1.start_date = t2.start_date

参见 SQL Fiddle with Demo

所有查询都会产生相同的结果:

| ID | USER_ID |                      START_DATE | STATUS_ID | PAYMENT_ID |
---------------------------------------------------------------------------
|  8 |       4 |  January, 05 2012 00:00:00+0000 |         2 |        875 |
|  4 |       5 | November, 25 2011 00:00:00+0000 |         1 |        128 |
|  6 |       6 | November, 25 2011 00:00:00+0000 |         2 |        542 |

关于sql-server - SQL 服务器 : select distinct by one column and by another column value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13461902/

相关文章:

sql - Oracle SQL : Order by with GROUP BY ROLLUP

sql-server - SQL Server触发器切换Insert、Delete、Update

mysql - SQL 选择每天最早开始日期时间和最晚结束日期时间

sql - SELECT 子查询中的 ORACLE ORDER BY

php - MySQL 选择 CURDATE 和 ORDER

Mysql 5.5/phpmyadmin 简单查询之谜

mysql - 如何按每列不同优先级的多列排序?

sql - SQL Server 是否真的计算 case 表达式中的每个 'then' 子句?

c# - SqlException ErrorCode 返回 -2146232060 而不是 26(找不到服务器实例)

SQL INSERT 从表 A 到表 B 缺少行