COUNTIFS由多个大于SQL的条件组成

时间:2013-01-22 15:16:52

标签: sql

我正在尝试在SQL中使用COUNT()OVER(ORDER BY)来创建下面的COUNT列。在这里,COUNT为您提供从购买日期到活动日期当前行价等于或超过当前行价的售票数量。在这种情况下,通风口发生在1/15/13。例如,从12/3/2012 to 1/15/13我们卖出了5张票价在420美元或以上。另一个例子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

1 个答案:

答案 0 :(得分: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”的表达式中。我们可以通过减去两个值得到类似A-C的东西,但这仍然无济于事。

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

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

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