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 = 2
和 TC_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]
我有 2 个 tables - TC 和 T,列如下。 TC 映射到列 T_ID.
上的 TTC
----
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 = 2
和 TC_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]