Tsql 如何在NVARCHAR类型的列上使用聚合函数获取列中的第一个可用值(而不是MIN)?
我有一张临时桌(#诱人),看起来像这样:Tsql 如何在NVARCHAR类型的列上使用聚合函数获取列中的第一个可用值(而不是MIN)?,tsql,sql-server-2008-r2,group-by,aggregate-functions,Tsql,Sql Server 2008 R2,Group By,Aggregate Functions,我有一张临时桌(#诱人),看起来像这样: AID StartTime EndTime StartSID EndSID Name 我如何在Name上使用聚合函数,以便当我按开始时间和结束时间分组时,我在Name列中得到John Pringle(我尝试使用MIN(Name),但它给了我空值,如果我使用MAX(Name)我得到了杰夫·史密斯(Jeff Smith)) 基本上,我的要求是获取列Name 这是我的疑问: SELECT TT.AID,
AID StartTime EndTime StartSID EndSID Name
我如何在Name上使用聚合函数,以便当我
按开始时间和结束时间分组时,我在Name列中得到John Pringle(我尝试使用MIN(Name)
,但它给了我空值,如果我使用MAX(Name)
我得到了杰夫·史密斯(Jeff Smith))
基本上,我的要求是获取列Name
这是我的疑问:
SELECT
TT.AID,
MIN(StartTime) as StartTime,
MAX(EndTime) as Endtime,
MIN(StartSSID) as StartSID,
MAX(EndSSID) AS EndSID,
-- I tried MIN(Name) here but I get empty cell, MAX(Name) gives wrong result. Basically I want first available value in the Name column here (which is John Pringle).
FROM
#TempTable TT
GROUP BY TT.AID, StartTime, EndTime
AID StartTime EndTime StartSID EndSID Name
79F05D45 2013-07-02 2013-07-03 1226349 1227338
79F05D45 2013-07-03 2013-07-03 1227381 1239004
我得到的结果:
SELECT
TT.AID,
MIN(StartTime) as StartTime,
MAX(EndTime) as Endtime,
MIN(StartSSID) as StartSID,
MAX(EndSSID) AS EndSID,
-- I tried MIN(Name) here but I get empty cell, MAX(Name) gives wrong result. Basically I want first available value in the Name column here (which is John Pringle).
FROM
#TempTable TT
GROUP BY TT.AID, StartTime, EndTime
AID StartTime EndTime StartSID EndSID Name
79F05D45 2013-07-02 2013-07-03 1226349 1227338
79F05D45 2013-07-03 2013-07-03 1227381 1239004
我想要的结果:
AID StartTime EndTime StartSID EndSID Name
79F05D45 2013-07-02 2013-07-03 1226349 1227338
79F05D45 2013-07-03 2013-07-03 1227381 1239004 John Pringle
谢谢 我希望没有文本列,因为标题表明我指的是字符串(NVARCHAR)类型的列。我只是用了一个通用术语“text”。那么Group By TT.AID呢?@Learner我看不出有任何理由需要它,这只是样本数据。我在数据中有多个辅助工具。抱歉搞混了。如果可能的话,我需要一组一组的解决方案。在发布问题之前,我研究了这种方法。此处:@Learner在分割子句中添加了辅助。这应该能解决问题
;WITH a as
(
SELECT
AID,
StartTime,
EndTime,
StartSSID,
EndSSID,
rn = row_number() over (partition by AID,cast(starttime as date) order by case WHEN name = '' or name is null then '20990101' else starttime end, starttime)
FROM
#TempTable TT
)
SELECT AID, StartTime, EndTime, StartSSID, EndSSID
WHERE rn = 1