【问题标题】:SQL Partition RankSQL 分区等级
【发布时间】:2017-11-18 21:50:29
【问题描述】:

我试图通过遵循某种模式的 ID 号每年获得一个唯一的许可证。我曾尝试使用排名和分区,但在获得最终输出时遇到了一些麻烦,因为某些许可证在彼此之前和之后具有不同的开始日期和结束日期。现在的数据看起来像:

理想情况下,我希望最终输出为:

【问题讨论】:

  • 上面的例子是针对一个ID的。我有超过一百万,这就是为什么这对我来说很困难。谢谢
  • by ID Number that follows a pattern. 哪种模式?你能解释一下吗?我在这张表中看不到任何模式。
  • 我正在尝试在接下来的几年中频繁出现的许可证。
  • 每年/许可证是否有一行?你想要那些存在多年的许可证吗?你想要那些在Reneval 列中有大于 1 的值吗?
  • @dnoeth 完全正确。续约应该不重要。如果我们看上面的例子,一旦正确完成更新应该是顺序的。 0...1...2...等2015 年、2016 年、2017 年等。

标签: sql teradata rank partition


【解决方案1】:

为什么交错的开始/结束日期很重要?只要你能确定一条记录属于哪一年,你就可以这样做:

SELECT *
FROM <Table_Name>
QUALIFY RANK() OVER(PARTITION BY ID_Number, Year ORDER BY <Some_Expression>) = 1

这将为每个(ID/年份)组合创建一个分区(组),然后您可以根据需要对其进行处理。使用&lt;Some_Expression&gt; 对行进行排序,以便包含要显示的数据的行排在顶部。 RANK = 1 将仅返回每组的“顶部”行。

这是否符合您的要求?

【讨论】:

  • 不幸的是,这不会得到最终输出。
【解决方案2】:
select *
from mytable
qualify max(year) over (partiton by license)     -- example:
      - min(year) over (partiton by license)     -- 2017 - 2015 = 2
      = count(*)  over (partiton by license) - 1 -- three rows -1 = 2 
    and count(*)  over (partiton by license) > 1

超过一年,而且这些年是连续的。

【讨论】:

  • 嗯...似乎不起作用。没有从该查询中获得任何输出。不过谢谢你
  • 当然,我的逻辑是错误的,你从2015年到2017年算三年,但是2017-2015返回两年。修好了。
  • 非常感谢。为了我的缘故,我只需要了解其中的逻辑。但是,我没有得到 2014 年的任何记录。有没有办法编辑这个逻辑来获得 2014 年的(随机或第一个)记录?我只得到三分(2015-2017)。
  • @ali.hash2:如果2014年同一个license也有一行,会被退回。否则,您需要向您的问题添加更多示例数据...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 2018-11-30
  • 2022-01-21
  • 2015-09-20
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多