【发布时间】:2016-05-10 10:19:46
【问题描述】:
我有下表:
ITEM DATE VALUE
----------------------
ITEM1 2016-05-04 1
ITEM1 2016-05-05 3
ITEM1 2016-05-06 3
ITEM1 2016-05-09 3
ITEM1 2016-05-04 4
ITEM2 2016-05-10 1
ITEM2 2016-05-05 2
ITEM2 2016-05-06 3
ITEM2 2016-05-09 1
ITEM2 2016-05-10 1
我想知道,每个项目,有多少条目及时返回值列是相同的(平坦):
ITEM DATE VALUE NUM_FLAT_ENTRYPOINTS
------------------------------
ITEM1 2016-05-04 1 0
ITEM1 2016-05-05 3 0
ITEM1 2016-05-06 3 1
ITEM1 2016-05-09 3 2
ITEM1 2016-05-10 4 0
ITEM2 2016-05-04 1 0
ITEM2 2016-05-05 2 0
ITEM2 2016-05-06 3 0
ITEM2 2016-05-09 1 0
ITEM2 2016-05-10 1 1
我最初的想法是:
select
*,
rank()-1 over (partition by ITEM,VALUE order by DATE) as NUM_FLAT_ENTRYPOINTS
from my_table
但是,这不起作用,因为 ITEM2 会将 2016-05-04、2016-05-09 和 2016-05-10 分区在一起,并在最后一行的 NUM_FLAT_ENTRYPOINTS 中显示 2 而不是 1。
我使用的是 Microsoft SQL Server 2008。
有什么想法吗?
编辑:
在 Oracle(以及可能的其他 SQL Server)中,我似乎可以做到
select
count(VALUE)-1 over (partition by ITEM,VALUE order by DATE) as NUM_FLAT_ENTRYPOINTS
from my_table
但据我所知,这种语法在 SQL Server 2008 中不起作用。有什么办法可以解决它?
【问题讨论】:
-
我假设在您的示例数据中,每个项目的最后一行应该是
2016-05-10,而不是2016-05-04,并且DATE定义了应该评估行的顺序?否则,请详细说明这里的规则... -
您说得对,先生,修正!
标签: sql sql-server sql-server-2008 window-functions