2009-06-05 86 views
2

查找行我有一個數據庫表結構如下(略去了不相關的字段):SQL:where字段值不同

rankings 
------------------ 
(PK) indicator_id 
(PK) alternative_id 
(PK) analysis_id 
rank 

所有字段是一個整數;前三個(標有「(PK)」)是一個複合主鍵。一個給定的「分析」有多個「替代品」,每個「替代品」對於許多「指標」中的每一個都有「排名」。

我正在尋找一種有效的方法來比較任意數量的分析,其任何替代/指標組合的排名不同。因此,舉例來說,如果我們有這樣的數據:

analysis_id | alternative_id | indicator_id | rank 
---------------------------------------------------- 
      1 |    1 |   1 | 4 
      1 |    1 |   2 | 6 
      1 |    2 |   1 | 3 
      1 |    2 |   2 | 9 
      2 |    1 |   1 | 4 
      2 |    1 |   2 | 7 
      2 |    2 |   1 | 4 
      2 |    2 |   2 | 9 

...那麼理想的方法將確定以下區別:

analysis_id | alternative_id | indicator_id | rank 
---------------------------------------------------- 
      1 |    1 |   2 | 6 
      2 |    1 |   2 | 7 
      1 |    2 |   1 | 3 
      2 |    2 |   1 | 4 

我想出了一個查詢,做什麼,我想要的2個分析ID,但我無法將其推廣到找出任意數量的分析ID之間的差異(即用戶可能想要比較2,或5,或9等),並找到至少有一個分析的任何行不同於其他任何)。我的查詢是:

declare @analysisId1 int, @analysisId2 int; 
select @analysisId1 = 1, @analysisId2 = 2; 

select 
    r1.indicator_id, 
    r1.alternative_id, 
    r1.[rank] as Analysis1Rank, 
    r2.[rank] as Analysis2Rank 
from rankings r1 
inner join rankings r2 
    on r1.indicator_id = r2.indicator_id 
     and r1.alternative_id = r2.alternative_id 
     and r2.analysis_id = @analysisId2 
where 
    r1.analysis_id = @analysisId1 
    and r1.[rank] != r2.[rank] 

(它把分析的值到其他字段,而不是行,我認爲無論哪種方式是可行的。)

我怎麼能概括這個查詢要處理很多分析IDS? (或者,或者想出一個更好的查詢來完成這項工作?)我使用的是SQL Server 2005,以防萬一。

如果有必要,我總是可以將所有數據從表格中取出並查找代碼的差異,但是SQL解決方案會更可取,因爲我經常只關心幾千行中的幾行,並且沒有意義如果我能避免它們,將它們全部轉移。 (但是,如果你有一個令人信服的理由不在SQL中這麼做,那麼說 - 我認爲這也是一個好的答案!)

回答

2

這將返回所需的數據集 - 現在你只需要一種方法來所需的分析IDS傳遞給查詢。或者可能只是在應用程序中過濾這些數據。

select r.* from rankings r 
    inner join 
    (
     select alternative_id, indicator_id 
     from rankings 
     group by alternative_id, indicator_id 
     having count(distinct rank) > 1 
    ) differ on r.alternative_id = differ.alternative_id 
    and r.indicator_id = differ.indicator_id 
    order by r.alternative_id, r.indicator_id, r.analysis_id, r.rank 
+0

完美 - 無需臨時表即可完成此操作!謝謝! – 2009-06-05 17:18:28

1

我不知道你使用的數據庫在SQL Server I中會這樣:

-- STEP 1, create temporary table with all the alternative_id , indicator_id combinations with more than one rank: 
select alternative_id , indicator_id 
into #results 
from rankings 
group by alternative_id , indicator_id 
having count (distinct rank)>1 

-- STEP 2, retreive the data 

select a.* from rankings a, #results b 
where a.alternative_id = b.alternative_id 
and a.indicator_id = b. indicator_id 
order by alternative_id , indicator_id, analysis_id 

順便說一句,這裏給出的其他答案需要計數(不同級別)!!!!!

+0

這正是我所要求的 - 謝謝!儘管如此,我必須點頭表示丹不用臨時表。 ;-) – 2009-06-05 17:21:08

+0

ahhh,我愛臨時表!對此感到抱歉:-) – tekBlues 2009-06-05 17:32:42

0

我想這是你想要做什麼:

select 
    r.analysis_id, 
    r.alternative_id, 
    rm.indicator_id_max, 
    rm.rank_max 
from rankings rm 
    join (
     select 
      analysis_id, 
      alternative_id, 
      max(indicator_id) as indicator_id_max, 
      max(rank) as rank_max 
     from rankings 
     group by analysis_id, 
      alternative_id 
     having count(*) > 1 
    ) as rm 
    on r.analysis_id = rm.analysis_id 
    and r.alternative_id = rm.alternative_id 
0

你的差異似乎是錯誤的。你說你想要分析其任何替代/指標組合的排名不同但示例行3和4不符合此標準。根據您的要求正確的結果是:

analysis_id | alternative_id | indicator_id | rank 
---------------------------------------------------- 
     1 |    1 |   2 | 6 
     2 |    1 |   2 | 7 
     1 |    2 |   1 | 3 
     2 |    2 |   1 | 4 

在查詢,你可以嘗試是這樣的:

with distinct_ranks as (
    select alternative_id 
    , indicator_id 
    , rank 
    , count (*) as count 
    from rankings 
     group by alternative_id 
     , indicator_id 
     , rank 
    having count(*) = 1) 
select r.analysis_id 
    , r.alternative_id 
    , r.indicator_id 
    , r.rank 
from rankings r 
    join distinct_ranks d on r.alternative_id = d.alternative_id 
     and r.indicator_id = d.indicator_id 
     and r.rank = d.rank 

你必須認識到,在多個分析你的標準是模糊的。如果分析1,2和3的等級爲1,4,5和6的等級2爲替代/指標1/1?集合(1,2,3)與集合(4,5,6)是「不同的」,但每集合內部沒有區別。在這種情況下你想要的行爲是什麼,如果它們出現或不出現?我的查詢查找所有其他分析中具有不同排名的記錄*,但不清楚這是否符合您的要求。