2013-01-22 37 views
1

我試圖在SQL中使用COUNT()OVER(ORDER BY)來創建下面的COUNT列。在這裏,COUNT會爲您提供從購買日期直到活動日期相等或超過當前行價格的門票數量。在這種情況下,通風口發生在1/15/13。例如,從12/3/2012 to 1/15/13我們售價爲420美元或以上的5張門票。另一個例子f,從12/25/12 to 1/15/13我們售出6張或以上的門票。COUNTIFS由多個SQL中的條件多於

在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 
+0

您使用的是什麼RDBMS?什麼版本? – GarethD

+0

數據不完整。您的計數爲20,但只有15個數據行。 –

+0

沒錯,這只是總行數的一個樣本。 – dataowl

回答

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度的線,這不是我們想要的。

據我所知,某種形式的自聯接是唯一的解決方案。在我原來的答案(在頂部)的形式可能是最簡單的方法來做到這一點。如果你有價格和日期的指數,甚至應該是有效的。

+0

天才!現在,數據庫有多個事件日期,每個事件日期都有一些類似的價格和日期數據。 (即有一個Event_Date列)如何劃分查詢,以便通過Event_Date獲得相同的「反向運行」總計。 – dataowl

+0

你可以問一個關於樣本數據的問題嗎?我仍在思考這是否可能使用分析函數。我想我明白爲什麼這是不可能的,但我不明白要解釋它(這意味着我錯了很可能)。 –

+0

當我通過MS Query運行此查詢時,爲什麼我的別名消失了嗎? – dataowl