2010-10-25 50 views
0

再次我堅持計算MySQL中的某些東西。數據庫結構遠遠沒有被SOers稱爲最佳,但我在這裏沒有影響力,不得不忍受它。大概是爲什麼我需要再次求助得到一些信息出來的:)計算一段時間內價值的變化?

假設我的原因that's一個有: SOME_ID(表不是PK,不是唯一的), 年,月(無日期字段只有兩個整數字段), some_flag(字符是A或B)。

現在我想知道some_flag發生了多少次變化(在給定的時間跨度內)。在第一種方法中,時間跨度並不是非常重要,我只需要知道發生了多少變化。請注意,更改只能每月進行一次。我的查詢:

SELECT some_id,year,some_flag FROM mytable 
WHERE some_flag = "A" OR someflag = "B" 
AND year > 2005 
GROUP BY some_id,some_flag 
HAVING COUNT(DISTINCT some_flag) > 1 

返回空結果集。它出什麼問題了?我相信有多年在經過數月的標誌變化...

是不是像

select .... , sum(case when month=month-1 and some_flag != some_flag then 1 else 0 end)  as changecount 

可能嗎?

+0

你能張貼一些示例數據和你想要什麼輸出嗎? – 2010-10-25 15:17:58

回答

0

some_flag分組你讓COUNT(DISTINCT some_flag)是始終爲1

嘗試僅僅通過some_id gouping。我希望這有幫助。

2

試試這個:

SELECT some_flag, COUNT(some_id) FROM mytable 
WHERE some_flag = "A" OR someflag = "B" 
AND year > 2005 
GROUP BY some_flag 
HAVING COUNT(some_id) > 1

CNC中
如果你想看到一個一個月一個月算,試試這個:
(注:它只會顯示的月份裏它已經改變)

SELECT some_flag, year, month, COUNT(some_id) FROM mytable 
WHERE some_flag = "A" OR someflag = "B" 
AND year > 2005 
GROUP BY some_flag, month, year 
HAVING COUNT(some_id) > 1
+0

這很接近......但不幸的是,它只是返回了id的總數量,而不僅僅是#的變化數量。這隻有在集合中的某個時間點(some_id)只有一個觀察值時纔有效。也許,我最好看看發佈這個問題相關的腳本。 – 2010-10-25 13:06:10

+0

是否有更改數量的列?你的問題並不表明這一點。 – 2010-10-25 13:12:54

+0

如果有一列包含更改數量的列,則可以使用SUM(num_changes)替換COUNT(some_id)。 – 2010-10-25 13:38:08

2

它在我看來,你需要做兩件事。

首先,執行此SQL查詢來獲取所有值的some_id, some_flag

SELECT some_id, some_flag, year, month 
FROM ... 
WHERE year > 2005 
ORDER BY some_id, some_flag, year, month 

然後,運行通過匹配/合併過程的輸出,以檢測當some_flag變化對於一個給定some_id。保存some_flag在比賽/合併過程中報告的年份和月份。

+0

是的,這是我現在嘗試設置的基本原因,現在我嘗試用另一種語言運氣的原因... – 2010-10-25 13:46:11