数据分组取最大行:
现有如下的业务:
当前存在库房表,库房在每年都进行维护,每次维护后,会记录库房中商品的数量和维护的数量,在每年会不定期的进行维护:
当前需要统计每年的库房中最新的信息:即最新月份的数据:如下所示表结构:
1 SELECT t.*, 2 t.rowid 3 FROM stores t
那么目前,需要求出的数据是
2012-10、2011-06、2010-12三条数据,即根据年份分租找到其中最大的行记录:
可以采用以下两种方式去实现:
1、使用MAX()
1 SELECT t.*, 2 t.rowid 3 FROM stores t 4 WHERE t.times IN 5 (SELECT MAX(t.times) FROM stores t GROUP BY substr(t.times, 1, 4))
2、使用分析函数,OVER/PARTATION ROWNUMBER
1 SELECT * 2 FROM (SELECT t.*, 3 row_number() over(PARTITION BY substr(t.times, 1, 4) ORDER BY t.times DESC) rn 4 FROM stores t) 5 WHERE rn = 1;
以上两种方式的SQL语句均可以实现结果:
使用DECODE进行行转列统计:(decode哪列则不group by哪列)
1 SELECT MAX(decode(cols.times, '2012-10', cols.store_number)) AS "2012", 2 MAX(decode(cols.times, '2011-06', cols.store_number)) AS "2011", 3 MAX(decode(cols.times, '2010-12', cols.store_number)) AS "2010" 4 FROM (SELECT * 5 FROM stores t 6 WHERE t.times IN (SELECT MAX(t.times) 7 FROM stores t 8 GROUP BY substr(t.times, 1, 4))) cols