1

我正在尝试COUNT()OVER(ORDER BY)在 SQL 中使用来创建COUNT下面的列。在这里,COUNT 为您提供从购买日期到活动日期的等于或高于当前行价格的门票数量。在这种情况下,发泄发生在1/15/13。例如,12/3/2012 to 1/15/13我们以 420 美元或以上的价格售出了 5 张门票。另一个例子f,从12/25/12 to 1/15/13我们卖了6张或以上的票。

在 Excel 中,公式为=+COUNTIFS([Price],">="&[@Price],[Date],">="&[@Date]). 这就是COUNT计算列的方式。

在 SQL 中,我得到的最远在下面,结果在 SQL_COUNT 列中。如您所见,它不起作用。

SELECT DATE, PRICE, 
COUNT(PRICE) OVER (order by PRICE desc)
FROM O.ELEMENTS ELEMENTS
WHERE (DATE={ts '2013-01-15 00:00:00'})
ORDER BY PRICE DESC


PRICE   DATE        COUNT   SQL_COUNT
700 1/8/2013    2   2
700 1/10/2013   1   2
440 1/9/2013    2   3
420 12/3/2012   5   5
420 12/18/2012  4   5
400 12/11/2012  5   6
390 12/3/2012   7   7
370 8/29/2012   11  11
370 11/29/2012  10  11
370 11/29/2012  10  11
370 12/17/2012  5   11
360 10/18/2012  11  12
350 1/5/2013    5   14
350 1/9/2013    3   14
340 6/23/2012   20  20
4

1 回答 1

2

我不确定你可以用窗口函数做到这一点。您可以使用相关的子查询来做到这一点:

select date, price,
       (select count(*) from o.elements e2 where e2.date >= e.date and e2.price >= e.price
       ) as YourCount
from o.elements e
WHERE (DATE={ts '2013-01-15 00:00:00'})
ORDER BY PRICE DESC

这个问题困扰了我一整天(幸运的是这天工作轻松)。我越来越多地认为,仅靠窗口函数无法解决这个问题——这让我感到惊讶。窗口函数独立处理每个维度。换句话说,该order by子句在考虑下一个维度之前先在一个维度中遍历所有内容。

以几何方式考虑这一点。两个轴是价格和日期维度。数据实际上是沿着这两个维度的散点图。给定点将散点图分成四个象限。我们正在寻找的是 D 中的点数(价格和日期都较大):

|  C   |  D
|------+------
|      |
|  A   |  B
 -------------

顺便说一句,当使用变量值而不是实际值的等级时,几何问题本质上是相同的。

我们可以很容易地得到任意两个相邻区域的记录数。例如,C+D 是:

count(*) over (order by price)

或者,对于 A+B:

count(*) over (order by price desc)

问题在于混合维度。这些是垂直线,将空间分成两个不同的区域。没有办法将它们组合在一个仅捕获“D”的表达式中。我们可以通过减去两个值得到类似 AC 的东西,但这仍然没有帮助。

这并不能证明最初的目标是不可能的。这只是暗示在一个维度上使用排序是不够的。

添加第二个维度order by price, date也不起作用。如果价格没有联系,这没有任何作用,我们回到最初的情况。像按价格排名和按日期排名并使用总和(或平均值)这样的技巧是行不通的。生成的几何解释有 45 度的线,这不是我们想要的。

据我所知,某种形式的自联接是唯一的解决方案。我原始答案中的表格(在顶部)可能是最简单的方法。如果你有关于价格和日期的索引,甚至应该是有效率的。

于 2013-01-22T15:42:07.547 回答