2014-03-26 36 views
1

我希望能夠選擇Somedata_A和Somedata_B列中的數據與其列中前一行的數據更改的次數。我試過使用DISTINCT,它在一定程度上起作用。 {1,2,3,2,1,1}將顯示3,當我想讓它顯示4路線時,有5個不同的值按順序排列。在列內出現不同的計數

實施例:

A,B,C,D,E,F 
{1,2,3,2,1,1} 

A比較B給出的差,B比較C給出的差。 。 。 EF相比沒有差別。總而言之,它在一組6個值內給出了4個差異。

我已經得到DISTINCT工作,但它並沒有真正爲我做伎倆。爲了增加更多的問題,我對整個範圍並不感興趣,可以說每個標題只有2個最後的日期/條目。

其次,我關心性能問題。我在下面的一組實際數據上嘗試了查詢,並且可能由於超時而中斷。

SQL Fiddle

MySQL的32年5月5日架構設置

CREATE TABLE testdata(
Title varchar(10), 
Date varchar(10), 
Somedata_A int(5), 
Somedata_B int(5)); 


INSERT INTO testdata (Title, Date, Somedata_A, Somedata_B) VALUES 
("Alpha", '123', 1, 2), 
("Alpha", '234', 2, 2), 
("Alpha", '345', 1, 2), 
("Alpha", '349', 1, 2), 
("Alpha", '456', 1, 2), 
("Omega", '123', 1, 1), 
("Omega", '234', 2, 2), 
("Omega", '345', 3, 3), 
("Omega", '349', 4, 3), 
("Omega", '456', 5, 4), 
("Delta", '123', 1, 1), 
("Delta", '234', 2, 2), 
("Delta", '345', 1, 3), 
("Delta", '349', 2, 3), 
("Delta", '456', 1, 4); 

查詢1

SELECT t.Title, (SELECT COUNT(DISTINCT Somedata_A) FROM testdata AS tt WHERE t.Title = tt.Title) AS A, 
    (SELECT COUNT(DISTINCT Somedata_B) FROM testdata AS tt WHERE t.Title = tt.Title) AS B 
    FROM testdata AS t 
    GROUP BY t.Title 

Results

| TITLE | A | B | 
|-------|---|---| 
| Alpha | 2 | 1 | 
| Delta | 2 | 4 | 
| Omega | 5 | 4 | 
+0

你說得對。更正了錯誤。 – Skjaar

+0

連續的記錄是否像你的例子一樣相隔1天? (如果你總是可以加入下面的連續記錄,答案會變得更加容易) – AgRizzo

+0

那麼,記錄將永遠是一個新的身份識別碼,因此就像他們相隔1天一樣。 – Skjaar

回答

1

像這樣的東西可能工作:它使用行號的變量,加入對1的偏移量,然後計算A和B.

差異

http://sqlfiddle.com/#!2/3bbc8/9/2

set @i = 0; 
set @j = 0; 

Select 
A.Title aTitle, 
sum(Case when A.SomeData_A <> B.SomeData_A then 1 else 0 end) AVar, 
sum(Case when A.SomeData_B <> B.SomeData_B then 1 else 0 end) BVar 
from 
(SELECT Title, @i:[email protected]+1 as ROWID, SomeData_A, SomeData_B 
FROM testdata 
ORDER BY Title, date desc) as A 
INNER JOIN 
(SELECT Title, @j:[email protected]+1 as ROWID, SomeData_A, SomeData_B 
FROM testdata 
ORDER BY Title, date desc) as B 
ON A.RowID= B.RowID + 1 
AND A.Title=B.Title 
Group by A.Title 
0

這工作(見here)(FYI:您的問題結果不符合您的數據 - 例如,對於阿爾法,ColumnA:它永遠不會從1更改答案應該是0)

希望你可以在此聲明適應實際的數據模型

SELECT t1.title, SUM(t1.Somedata_A<>t2.Somedata_a) as SomeData_A 
    ,SUM(t1.Somedata_b<>t2.Somedata_b) as SomeData_B 
FROM testdata AS t1 
JOIN testdata AS t2 
    ON t1.title = t2.title 
    AND t2.date = DATE_ADD(t1.date, INTERVAL 1 DAY) 
GROUP BY t1.title 
ORDER BY t1.title; 
+0

結果基於DISTINCT,它計算A列中有1次出現1次。我希望它爲零,但我最大的努力只是使用DISTINCT。 – Skjaar

+0

是否有可能得到一個沒有DATE_ADD函數的例子?我更新了數據,看起來更像我使用的數據。 – Skjaar