2010-09-22 64 views
1

我有一张名为取款的表格,其中包含:名称,年份,期间,金额。获取记录的最大值

EX:

Name Year Period Amount 
-------------------------------- 
Jim 2010 1   100 
Jim 2009 4   99 
Jim 2009 3   17 
Kim 2007 2   234 
Ryu 2008 5   555 

我被卡住了,我不能得到它具有最近一年与最近一段时期的名称&量的最新值。

我试图使用查询:

select max(year), max(period), name from withdrawarls 

但我得到错误的结果。

所以,我怎样才能得到正确的值:

Jim, 2010, 1, 100 
Kim, 2007, 2, 234 
RYU, 2008, 5, 555. 

回答

0
SELECT * 
FROM Withdrawals w 
JOIN (Select Name, Max(year) year 
     FROM Withdrawals 
     group by name) t ON (t.Name = w.Name AND t.Year = w.Year) 
+0

看起来非常接近,但你忘记了这个时期.. – 2010-09-22 13:06:27

+0

谢谢,但那个时期呢?如果有值3和4,它应该选择4.我如何取最大年份的最长时间? – mohs 2010-09-22 15:37:16

0
select * from @tbl t 
where t.year in (select max(year) from @tbl group by name) 

随着数据您提供

declare @tbl table 
(
    name varchar(10), 
    year varchar(10), 
    period int, 
    amount int 
) 

insert into @tbl select 'Jim', '2010', 1, 100 
insert into @tbl select 'Jim', '2009', 4, 99 
insert into @tbl select 'Jim', '2009', 3, 17 
insert into @tbl select 'Kim', '2007', 2, 234 
insert into @tbl select 'RYU', '2008', 5, 555 

select * from @tbl t 
where t.year in (select max(year) from @tbl group by name) 
+0

用你需要的列名替换'*' – Kashif 2010-09-22 13:09:11

+0

感谢您的帮助,但那段时间呢?如果有两个时期3,4,它应该是最大时期,那么我应该包括什么? – mohs 2010-09-22 15:36:16

+0

Quassnoi的解决方案应该为你工作。不是吗? – Kashif 2010-09-22 15:53:00

0
select max(year), max(period), name from withdrawals group by name; 

当使用聚合函数(即最小,最大,count)非聚合列应列在“集团“条款。在这种情况下,“名称”。

+0

不,这是行不通的,因为每年都会有不同的时间段,我应该在每个名称的最大年份中使用最长时间 – mohs 2010-09-22 15:55:24

2

MySQLPostgreSQL

SELECT t.* 
FROM (
     SELECT DISTINCT name 
     FROM mytable 
     ) td 
JOIN mytable t 
ON  (t.year, t.period) = 
     (
     SELECT year, period 
     FROM mytable ti 
     WHERE ti.name = td.name 
     ORDER BY 
       name DESC, year DESC, period DESC 
     LIMIT 1 
     ) 

SQL Server

SELECT t.* 
FROM (
     SELECT DISTINCT name 
     FROM mytable 
     ) td 
CROSS APPLY 
     (
     SELECT TOP 1 * 
     FROM mytable ti 
     WHERE ti.name = td.name 
     ORDER BY 
       year DESC, period DESC 
     ) t 

SQL ServerOracle

SELECT * 
FROM (
     SELECT t.*, ROW_NUMBER() OVER (PARTITION BY name ORDER BY year DESC, period DESC) AS rn 
     FROM mytable 
     ) t 
WHERE rn = 1 
+0

我会尝试这种做法并恢复原状。我希望它会在每个名称的最大年份中获得最大年份和最大期限。谢谢,并会回来 – mohs 2010-09-22 15:58:05

0

让我们期待周期小于100:

SELECT w.Name, w.Year, w.Period, w.Value 
FROM Withdrawals w, 
(SELECT Name, MAX(Year * 100 + Period) as maxTime 
FROM Withdrawals 
GROUP BY Name) AS maxW 
WHERE w.Name = maxW.Name 
AND w.Year * 100 + w.Period = maxW.maxTime 

max(Year),max(Period)的问题是“2010 1”晚于“2009 4”,而max(Year),max(Period)将返回“2010 4”这不存在。 “年* 100 +期”为您提供了一个良好的分类。