所以我有一个如下表:
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的所有其他行。不知道从这里去哪里。
答案 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