SQL-如何从具有相同主键的组行中选择最新日期

时间:2018-08-17 21:06:39

标签: sql sql-server tsql subquery

所以我有一个如下表:

  item_ID   |   item_date   |   status
-1147446003 |   2018-07-21  |  Assigned
-1147446003 |   2018-07-22  |  Completed
-1147446003 |   2018-07-23  |  Closed
-1147446001 |   2018-07-21  |  Assigned
-1147446001 |   2018-07-22  |  Updated
-1147446001 |   2018-07-22  |  Completed

我想做的是创建一个查询,该查询将仅向我返回item_ID的最新日期。这样的结果:

  item_ID   |   item_date   |   status
-1147446003 |   2018-07-23  |  Closed
-1147446001 |   2018-07-22  |  Completed

我尝试使用一个子查询,该子查询在日期上与一个左外部联接一起使用MAX()联接,但是它不起作用。我什至尝试做:

date = MAX(item_date) over (partition by item_ID)

但这只是使我想要的行条目位于结果的顶部,而它仍然包含该item_ID的所有其他行。不知道从这里去哪里。

4 个答案:

答案 0 :(得分:2)

首先,如果item_id具有重复项,则不是主键。这是一个术语问题,但是您应该了解“主键”的含义。

一种不使用子查询的简单方法是:

select top (1) with ties t.*
from t
order by row_number() over (partition by item_id order by item_date desc);

答案 1 :(得分:1)

不确定您使用的是哪个数据库,但是大多数数据库都支持ROW_NUMBER分析功能,您可以使用以下查询来获得所需的结果-

SELECT ITEM_ID, ITEM_DATE, STATUS FROM
(
SELECT 
ITEM_ID, ITEM_DATE, STATUS,
ROW_NUMBER() OVER (PARTITION BY ITEM_ID ORDER BY ITEM_DATE DESC) AS RNK
FROM TABLE_NAME
)X
WHERE RNK=1;

答案 2 :(得分:0)

使用rank获得所需的行。

select item_id,item_date,status
from (select t.*,rank() over(partition by item_id order by item_date desc) as rnk
      from tbl t
     ) t
where rnk=1

答案 3 :(得分:0)

以上两个答案都应该起作用,但是如果您使用的SQL不支持分析功能,则应该起作用。

SELECT a.item_ID,
    a.item_date,
    a.status
from [your_table_here] a
JOIN (
  SELECT item_ID 
    MAX(item_date) AS max_item_date
  FROM [your_table_here]
  GROUP BY 1
  ) b
ON a.item_ID = b.max_item_date
AND a.item_ID = b.item_ID