2017-10-10 87 views
0

我的问题似乎很简单,但我无法弄清楚。如何选择列的最大值

这是我有:

TIME   MAXVERSION 
13-12-31   1 
13-12-31   2 
14-12-31   1 
14-12-31   2 
14-12-31   3 
15-12-31   1 
15-12-31   2 
15-12-31   3 
16-12-31   1 

,这是我想拥有的一切:

TIME   MAXVERSION 
13-12-31   2 
14-12-31   3 
15-12-31   3 
16-12-31   1 

我已经试过这样:

select referencetid as time max(version) over (partition by referencetid order by version desc) as maxversion 
from D101200.PSD_BEFOLKNING_REFERENCE 
where to_char(referencetid, 'mm-dd') = '12-31' 
and to_char(referencetid, 'yy-mm-dd') between ('07-12-31') and ('16-12-31') 
order by referencetid; 

这让我排序我想要但不完全的重量:

TIME   MAXVERSION 
13-12-31   2 
13-12-31   2 
14-12-31   3 
14-12-31   3 
14-12-31   3 
15-12-31   3 
15-12-31   3 
15-12-31   3 
16-12-31   1 

这给了我正确的版本,但数据集没有缩小,这是我想要的。

任何帮助是非常可观的!

+0

如果我理解正确,您希望按日期聚合,那么您可以按时间使用该聚合的组,如在第一个答案中。 –

+1

退一步从具体问题,并阅读一些关于“分析功能”与“聚合函数”一般。你们两人之间显然很混乱;直到你非常清楚地了解两者之间的差异,你将无法编写出好的代码。 – mathguy

+0

你很可靠。我会花时间在两者之间进行区分。 – Sisse

回答

3

您是在寻找GROUP BY

 select Time, 
      Max(MaxVersion) as MaxVersion 
     from MyTable 
    group by Time 
    order by Time 
0
select 
referencetid as time, 
max(version)as maxversion 
from D101200.PSD_BEFOLKNING_REFERENCE 
where to_char(referencetid, 'mm-dd') = '12-31' 
and to_char(referencetid, 'yy-mm-dd') between ('07-12-31') and ('16-12-31') 
group by referencetid 
order by referencetid 

您可以使用此代码

+1

谢谢你一个很好的答案,没有别的! – Sisse

3

你需要修复您的日期计算!在查询中始终使用ISO标准YYYY-MM-DD(或YYYYMMDD)格式。不要使用字符串进行日期比较。

回答你的问题那么简单group by

select referencetid as time, max(version) 
from D101200.PSD_BEFOLKNING_REFERENCE 
where to_char(referencetid, 'mm-dd') = '12-31' and 
     referencetid between date '2007-12-31' and date '2016-12-31' 
group by referencetid 
order by referencetid; 

假设您有referencetid指数,我建议你只明确列出值:

select referencetid as time, max(version) 
from D101200.PSD_BEFOLKNING_REFERENCE 
where referencetid in (date '2007-12-31', date '2008-12-31', date '2009-12-31', 
         date '2010-12-31', date '2011-12-31', date '2012-12-31', 
         date '2013-12-31', date '2014-12-31', date '2015-12-31', 
         date '2016-12-31') 
group by referencetid 
order by referencetid; 

这使得查询更容易使用索引进行优化。

+0

“不要使用字符串进行字符串比较”?那有什么意思?你应该如何做STRING比较 - 使用什么? – mathguy

+0

@mathguy。 。 。我修正了这一点。 –

+0

那么,在上下文中,我会把它当作比较日期时的意思,不要这样做使用字符串表示。 – xQbert

1

好像日期列上很多问题今天询问31st December for the last N years

SELECT referencetid as time, 
     max(version) as maxversion 
FROM D101200.PSD_BEFOLKNING_REFERENCE 
WHERE referencetid IN (
     DATE '2016-12-31', 
     DATE '2015-12-31', 
     DATE '2014-12-31', 
     DATE '2013-12-31', 
     DATE '2012-12-31', 
     DATE '2011-12-31', 
     DATE '2010-12-31', 
     DATE '2009-12-31', 
     DATE '2008-12-31', 
     DATE '2007-12-31' 
     ) 
GROUP BY referencetid 
ORDER BY referencetid; 

使用TO_CHAR(或其他功能)作为过滤器的一部分将阻止查询使用该列的任何索引(你会需要一个基于函数的索引)。

0

正如已经被很多回答,有一些考虑,您洁具寻找GROUP BY,请看看this或其他例子here来学习如何使用它,这是一个很好的服务来试图查询sqlfiddle

select 
    referencetid as Time, 
    max(version) as maxversion 

from D101200.PSD_BEFOLKNING_REFERENCE 

where to_char(referencetid, 'mm-dd') = '12-31' 
    and to_char(referencetid, 'yy-mm-dd') between ('07-12-31') and ('16-12- 
31') 
group by referencetid 
order by referencetid; 
+0

这是[JurgenHakanHifzi的回答](https://stackoverflow.com/a/46668776/1509264) – MT0

+0

的副本我刚刚意识到他现在发布了几分钟前,如果你注意到我之前写了一条评论。 –

+0

谢谢你的链接! – Sisse