2010-01-12 30 views
2

我正在尋找每個ID每天兩個表之間的最大差異。我有一個MySQL數據庫SQL子查詢試圖獲得兩個表中同一列的最大差異

insert into test.foo values ('2010-01-10', 1, 10); 
insert into test.foo values ('2010-01-10', 1, 5); 
insert into test.foo values ('2010-01-10', 2, 10); 
insert into test.foo values ('2010-01-10', 2, 10); 
insert into test.foo values ('2010-01-10', 3, 15); 
insert into test.foo values ('2010-01-10', 3, 15); 
insert into test.foo values ('2010-01-11', 1, 5); 
insert into test.foo values ('2010-01-11', 1, 5); 
insert into test.foo values ('2010-01-11', 2, 5); 
insert into test.foo values ('2010-01-11', 2, 5); 
insert into test.foo values ('2010-01-11', 3, 5); 
insert into test.foo values ('2010-01-11', 3, 5); 

insert into test.bar values ('2010-01-10', 1, 5); 
insert into test.bar values ('2010-01-10', 1, 5); 
insert into test.bar values ('2010-01-10', 2, 5); 
insert into test.bar values ('2010-01-10', 2, 5); 
insert into test.bar values ('2010-01-10', 3, 5); 
insert into test.bar values ('2010-01-10', 3, 5); 
insert into test.bar values ('2010-01-11', 1, 10); 
insert into test.bar values ('2010-01-11', 1, 10); 
insert into test.bar values ('2010-01-11', 2, 5); 
insert into test.bar values ('2010-01-11', 2, 5); 
insert into test.bar values ('2010-01-11', 3, 5); 
insert into test.bar values ('2010-01-11', 3, 5); 

在這裏,下面的數據是我的查詢:

SELECT t1.`date`, t1.id, t1.sums, t2.sums, max(t1.sums - t2.sums) FROM 
    (select `date`, id, sum(val) sums 
    from test.foo 
    group by `date`, id) as t1, 
    (select `date`, id, sum(val) sums 
    from test.bar 
    group by `date`, id) as t2 
WHERE t1.`date` = t2.`date` AND t1.id = t2.id 
group by t1.`date` 

我得到這個結果:

+---------------------+----+------+------+------------------------+ 
| date    | id | sums | sums | max(t1.sums - t2.sums) | 
+---------------------+----+------+------+------------------------+ 
| 2010-01-10 00:00:00 | 1 | 15 | 10 |      20 | 
| 2010-01-11 00:00:00 | 1 | 10 | 20 |      0 | 
+---------------------+----+------+------+------------------------+ 
2 rows in set (0.00 sec) 

我想收到此結果: 我得到這個結果:

+---------------------+----+------+------+------------------------+ 
| date    | id | sums | sums | max(t1.sums - t2.sums) | 
+---------------------+----+------+------+------------------------+ 
| 2010-01-10 00:00:00 | 1 | 15 | 10 |      20 | 
| 2010-01-11 00:00:00 | 2 | 10 | 10 |      0 | <----- 
+---------------------+----+------+------+------------------------+ 

任何人都可以幫助我嗎?我希望得到最大的區別,然後是與之相伴的路線。這個查詢給了我正確的區別,但不是與它一起使用的id和總數。一位同事也建議按ID分組,但正如我所認爲的那樣,只是將結果放平,並且每個ID都列出來,而不是一天中具有最大差異的一個ID。

感謝很多提前

+0

什麼數據庫和版本? – RedFilter 2010-01-12 14:38:07

+0

不應該也是你的結果? – RedFilter 2010-01-12 14:39:37

+0

mysql Ver 14.14 Distrib 5.1.39,用於Win32(ia32) – 2010-01-12 14:40:50

回答

1

這一個應該爲你工作。

它按降序對總和進行排序,給它們分配一個等級,然後只得到rank = 1的那些。以下查詢

SELECT id, `date`, sums FROM (
    SELECT id, `date`, sums, 
    CASE 
    WHEN @d != `date` THEN @rownum := 1 
    ELSE @rownum := @rownum + 1 
    END AS rank, 
    @d := `date` 
FROM 
(
    SELECT t1.`date`, t1.id, t1.sums t1_sums, t2.sums t2_sums, (t1.sums - t2.sums) sums 
    FROM 
    (select `date`, id, sum(val) sums 
    from foo 
    group by `date`, id) as t1, 
    (select `date`, id, sum(val) sums 
    from bar 
    group by `date`, id) as t2, 
    (SELECT @rownum := 0, @d := NULL) r 
    WHERE t1.`date` = t2.`date` AND t1.id = t2.id 
    GROUP BY t1.`date`, t1.id, t2.`date`, t2.id 
    ORDER BY t1.`date`, (t1.sums - t2.sums) DESC, t1.id 
) x 
) y 
WHERE rank = 1 
+0

非常感謝您的幫助! – 2010-01-12 15:44:36

1
SELECT t1.`date`, t1.id, t1.sums, t2.sums, max(t1.sums - t2.sums) FROM 
    (select `date`, id, sum(val) sums 
    from test.foo 
    group by `date`, id) as t1, 
    (select `date`, id, sum(val) sums 
    from test.bar 
    group by `date`, id) as t2 
WHERE t1.`date` = t2.`date` AND t1.id = t2.id 
group by t1.`date` 

在你的日期,但不是ID分組外部查詢,因此你沒有得到您所期望的ID。如果您想查找與最高差異相關的ID,那麼首先您需要找到最高的差異性,然後使用另一個查詢來確定哪些ID(或多個ID)與此相關聯。你必須決定你想要做什麼與重複。像這樣的東西(未經測試)...

SELECT t3.`date`, t3.id, t3.diff 
    (SELECT t1.`date`, t1.id, t1.sums, t2.sums, max(t1.sums - t2.sums) as diff FROM 
    (select `date`, id, sum(val) sums 
    from test.foo 
    group by `date`, id) as t1, 
    (select `date`, id, sum(val) sums 
    from test.bar 
    group by `date`, id) as t2 
    WHERE t1.`date` = t2.`date` AND t1.id = t2.id) as t3 
WHERE t3.diff = (correlated subquery to get maximum value of diff for each date) 

或使用單獨的查詢。

+0

這兩個行都返回id'1'。 – 2010-01-12 15:07:22

0

輸出是:

+----------+- ---+------+------+-------+ 
|date  |id |sumf |sumb |maxdiff| 
+----------+- ---+------+------+-------+ 
|2010-01-10| 1| 30| 20|  10| 
|2010-01-10| 2| 40| 20|  20| 
|2010-01-10| 3| 60| 20|  40| 
|2010-01-11| 1| 20| 40|  20| 
|2010-01-11| 2| 20| 20|  0| 
|2010-01-11| 3| 20| 20|  0| 
+----------+- ---+------+------+-------+ 


select m.date, m.id, s.sumf, s.sumb, m.maxdiff 
from (
    --subquery2: get the maximum different absolute sum between foo and bar for each date/id combination 
    select s.date, s.id, max(abs(s.sumf - s.sumb)) as maxdiff 
    from (
     --subquery1: get the sum of values for each date/id combination 
     select f.date, f.id, sum(f.val) as sumf, sum(b.val) as sumb 
     from foo f 
     inner join bar b on f.date = b.date and f.id = b.id 
     group by f.date, f.id 
    ) s 
    group by s.date, s.id 
) m 
--join back against subquery1 to find out which sums gave us the max difference 
inner join (
    select f.date, f.id, sum(f.val) as sumf, sum(b.val) as sumb 
    from foo f 
    inner join bar b on f.date = b.date and f.id = b.id 
    group by f.date, f.id 
) s on m.date = s.date and m.id = s.id and m.maxdiff = abs(s.sumf - s.sumb) 

注:這將在被減去標的金額重複maxdiff S的情況下返回多行有不同的值。如果您必須返回sumfsumb,我相信這是正確的行爲,否則您不一定會獲得創建maxdiff的值。

+0

沒有嘗試過,但我想如果它們共享相同的max-diff,它會在每個日期返回多行記錄?由於這種情況下的行爲沒有定義,我很好奇,如果這是OP的意圖:) – 2010-01-12 15:20:23

+0

我更新了查詢的輸出。 – RedFilter 2010-01-12 15:22:05

+0

謝謝!這顯然是一個例子,將其轉化爲「真實」問題可能需要一些時間。唯一的原因是我沒有把它標記爲答案。畢竟,這是一個直接的查詢,而答案使用那些髒變量...... :) – 2010-01-12 15:42:55

相關問題