SQL按最近日期选择行


106

使用以下查询和结果,我正在寻找ChargeId和ChargeType唯一的最新条目。

select chargeId, chargeType, serviceMonth from invoice

    CHARGEID    CHARGETYPE  SERVICEMONTH
1   101     R       8/1/2008
2   161     N       2/1/2008
3   101     R       2/1/2008
4   101     R       3/1/2008
5   101     R       4/1/2008
6   101     R       5/1/2008
7   101     R       6/1/2008
8   101     R       7/1/2008

期望的:

    CHARGEID    CHARGETYPE  SERVICEMONTH
1   101     R       8/1/2008
2   161     N       2/1/2008

Answers:


147

您可以使用GROUP BY按类型和ID对项目进行分组。然后,您可以使用MAX()聚合函数来获取最近的服务月份。以下返回带有ChargeId,ChargeType和MostRecentServiceMonth的结果集

SELECT
  CHARGEID,
  CHARGETYPE,
  MAX(SERVICEMONTH) AS "MostRecentServiceMonth"
FROM INVOICE
GROUP BY CHARGEID, CHARGETYPE

1
不要忘记为MAX(serviceMonth)字段加上别名,以防您在下游需要它。
本·霍夫斯坦

2
好的,如果表中有101 N 1/1/2008行会怎样?
tvanfosson,

3
您将获得额外的一行返回。根据他的要求,这是期望的结果。
卡尔顿·詹克

1
向帖子中的查询添加了别名。tvanfosson-这是添加到结果集中的条件,这是正确的。
米切尔卖家

1
如果我还想同时提取记录ID。我该怎么做?
Donny V.

58

因此,这不是请求者要的,而是对“ SQL按最新日期选择行”的答案。

http://wiki.lessthandot.com/index.php/Returning_The_Maximum_Value_For_A_Row修改

SELECT t.chargeId, t.chargeType, t.serviceMonth FROM( 
    SELECT chargeId,MAX(serviceMonth) AS serviceMonth
    FROM invoice
    GROUP BY chargeId) x 
    JOIN invoice t ON x.chargeId =t.chargeId
    AND x.serviceMonth = t.serviceMonth

2
谢谢!这就是我想要的!
戴安娜(Diana)2014年

似乎与视图不兼容。
nuzzolilo

11
SELECT chargeId, chargeType, MAX(serviceMonth) AS serviceMonth 
FROM invoice
GROUP BY chargeId, chargeType

6

我看到大多数开发人员在使用内联查询时并未发现它对海量数据的影响。

简单地说,您可以通过以下方法实现此目的:

select a.chargeId, a.chargeType, a.serviceMonth 
from invoice a
left outer join invoice b
on a.chargeId=b.chargeId and a.serviceMonth <b.serviceMonth 
where b.chargeId is null
order by a.serviceMonth desc

1
select to.chargeid,t0.po,i.chargetype from invoice i
inner join
(select chargeid,max(servicemonth)po from invoice 
group by chargeid)t0
on i.chargeid=t0.chargeid

如果不同的费用ID具有不同的费用类型组合,则上面的查询将起作用。希望这个简单的查询有助于减少性能时间...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.