2016-03-03 103 views
1

最大值的我有2個表 - TC和T,具有低於指定列。 TC在列T_ID上映射到T.SQL服務器 - SELECT DISTINCT兩列,其中,所選擇的不同的列具有基於其它兩列

TC 
---- 
T_ID, 
TC_ID 

T 
----- 
T_ID, 
V_ID, 
Datetime, 
Count 

我現在的結果集爲:

V_ID TC_ID Datetime  Count 
----|-----|------------|--------| 
2 | 1 | 2013-09-26 | 450600 | 
2 | 1 | 2013-12-09 | 14700 | 
2 | 1 | 2014-01-22 | 15000 | 
2 | 1 | 2014-01-22 | 15000 | 
2 | 1 | 2014-01-22 | 7500 | 
4 | 1 | 2014-01-22 | 1000 | 
4 | 1 | 2013-12-05 | 0  | 
4 | 2 | 2013-12-05 | 0  | 

使用以下查詢:

select T.V_ID, 
    TC.TC_ID, 
    T.Datetime, 
    T.Count 
    from T 
    inner join TC 
    on TC.T_ID = T.T_ID 

結果集我想:

V_ID TC_ID Datetime  Count 
----|-----|------------|--------| 
2 | 1 | 2014-01-22 | 15000 | 
4 | 1 | 2014-01-22 | 1000 | 
4 | 2 | 2013-12-05 | 0  | 

我想編寫一個查詢選擇每個不同的V_ID + TC_ID組合,但只有最大的日期時間,以及該日期時間的最大計數。例如。爲V_ID = 2TC_ID = 1的不同組合,'2014-01-22'是最大的日期時間,併爲日期時間,15000是最大數,所以選擇此記錄爲新表。有任何想法嗎?我不知道這是一個查詢野心太大,我應該只是處理結果在代碼中設置來代替。

回答

2

一種方法是使用row_number()

select v_id, tc_id, datetime, count 
from (select T.V_ID, TC.TC_ID, T.Datetime, T.Count, 
      row_number() over (partition by t.V_ID, tc.tc_id 
           order by datetime desc, count desc 
           ) as seqnum 
     from t join 
      tc 
      on tc.t_id = t._id 
    ) tt 
where seqnum = 1; 

唯一的問題是,一些行具有相同的最大datetime值。 SQL表格代表無序集合,因此無法確定哪個實際上是最大值 - 除非datetime確實有時間分量或另一列指定一天內的排序。

+1

秩序,數遞減* – Yossi

0

只是爲了保持它的簡單: 你需要通過T.V_ID,TC.TC_ID, 組選擇日期的最大值,然後得到最大數,則必須按如下使用子查詢,

select T.V_ID, 
    TC.TC_ID, 
    max(T.Datetime) as Date_Time, 
    (select max(Count) from T as tb where v_ID = T.v_ID and DateTime = max(T.DateTime)) as Count 
    from T 
    inner join TC 
    on TC.T_ID = T._ID 
group by T.V_ID,TC.TC_ID, 
+0

這不工作,因爲它是 - T.DateTime不是group by子句或聚合函數,因此查詢錯誤。 – axel

+0

@spitfire對不起,我忘記使用T.DateTime的最大值,所以請在我編輯後檢查它。 – Boody

1

它可以解決這個使用CTE。首先,從您的查詢中提取數據。其次,獲得最高分數。三,獲得最高的計數每個的maxDate:通過日期時間倒序

;WITH Dataset AS 
(
    select T.V_ID, 
    TC.TC_ID, 
    T.[Datetime], 
    T.[Count] 
    from T 
    inner join TC 
    on TC.T_ID = T._ID 
), 
MaxDates AS 
(
    SELECT V_ID, TC_ID, MAX(t.[Datetime]) AS MaxDate 
    FROM Dataset t 
    GROUP BY t.V_ID, t.TC_ID 
) 
SELECT t.V_ID, t.TC_ID, t.[Datetime], MAX(t.[Count]) AS [Count] 
FROM Dataset t 
INNER JOIN MaxDates m ON t.V_ID = m.V_ID AND t.TC_ID = m.TC_ID AND m.MaxDate = t.[Datetime] 
GROUP BY t.V_ID, t.TC_ID, t.[Datetime] 
相關問題