sql group by和max以及其他值

时间:2015-02-19 13:26:40

标签: sql group-by

我有一张包含以下内容的表:

itemid inventdimid datephysical transrefid
10001   123         2015-01-02   300002
10002   123         2015-01-03    3566
10001   123         2015-02-05    55555
10002   124         2015-02-01     4545

我想要的结果

itemid inventdimid datephysical transrefid
10001   123           2015-02-05   555
10002   123           2015-01-03    3566
 10002   124         2015-02-01     4545

我的查询:

SELECT a.itemid,a.inventdimid,max(a.datephysical),a.transrefid
  FROM  a where dataareaid = 'ermi' 
group by a.itemid,a.inventdimid

它在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

4 个答案:

答案 0 :(得分:2)

使用ANSI标准row_number()功能:

select t.*
from (select t.*,
             row_number() over (partition by itemid, inventdimid
                                order by datephysical desc) as seqnum
      from table t
     ) t
where seqnum = 1;

答案 1 :(得分:0)

为每个itemid,inventdimid组合查找max(a.datephysical),选择该日期的所有行。

SELECT itemid, inventdimid, datephysical, transrefid
FROM  a a1
where dataareaid = 'ermi'
  and datephysical = (select max(datephysical)
                      from a a2
                      where a1.itemid = a2.itemid
                        and a1.inventdimid = a2.inventdimid
                        and a2.dataareaid = 'ermi')         

答案 2 :(得分:0)

您必须使用GROUP BY创建一个临时表,然后将原始表加入其中。

试试这个:

SELECT T1.*,T2.datephysical,T2.transrefid FROM 
(SELECT itemid,inventdimid 
         FROM TableName 
         GROUP BY itemid,inventdimid) T1 JOIN
(SELECT itemid,inventdimid,datephysical,transrefid
 FROM TableName) T2 ON T1.itemid=T2.itemid AND T1.inventdimid=T2.inventdimid

答案 3 :(得分:0)

我假设你想要与所显示的a.datephysical相对应的transrefid?这可以通过将列转换为子查询来完成:

SELECT a.itemid,a.inventdimid,max(a.datephysical),
(SELECT b.transrefid FROM MY_TABLE b where
b.datareaid = 'ermi' and b.itemid = a.itemid and b.inventdimid = a.itemid
and b.datephysical = max(a.datephysical)) as transrefid
FROM MY_TABLE a where dataareaid = 'ermi' 
group by a.itemid, a.inventdimid

某些数据库可能不支持此语法,如果有多个记录具有相同的日期,则会失败。