SQL 服务器 - Select 两列不同,其中所选的不同列具有基于其他两列的最大值

SQL Server - Select Distinct of two columns, where the distinct column selected has a maximum value based on two other columns

我有 2 个 tables - TC 和 T,列如下。 TC 映射到列 T_ID.

上的 T
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      |

我想为 select 每个不同的 V_ID + TC_ID 组合编写一个查询,但仅限于最大日期时间,并且对于该日期时间是最大计数。例如。对于 V_ID = 2TC_ID = 1 的不同组合,'2014-01-22' 是最大日期时间,对于该日期时间,15000 是最大计数,因此 select 此记录对于新 table。有任何想法吗?我不知道这对于查询来说是否过于雄心勃勃,我应该改为在代码中处理结果集。

一种方法使用 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 确实具有时间分量或另一列指定一天内下单。

为了简单起见: 您需要按 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,

可以使用 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]