SQL Server:从GROUPED BY结果集中选择特定行

时间:2018-10-01 02:01:02

标签: sql sql-server select group-by subquery

我遇到一个问题,我的查询需要从TransactionDateTime中选择ActivityId = 6,而不是ActivityId 66中的日期值。

数据集如下:

HistoryId | CardId | ActivityId | TransactionId | TransactionDateTime
----------+--------+------------+---------------+----------------------------------
393338052   58329067    12  937DB39B-711B-E611-80D3-0025B5560BDC  2016-06-01 01:43:28.307   
393342190   58329067    13  NULL    2016-06-01 01:50:02.243  2016-06-01 01:50:02.243
393506845   58329067     6  00000000-0000-0000-0000-000000000000  2016-06-01 08:51:44.640   
393506845   58329067    66  00000000-0000-0000-0000-000000000000  2016-06-03 09:01:20.017   
385651974   58329067     5  937DB39B-711B-E611-80D3-0025B5560BDC  2016-05-16 14:23:14.560   
385596117   58329067    16  NULL    2016-05-16 13:10:16.600  2016-05-16 13:10:16.600

此刻我的查询如下:

SELECT 
    CC.[CreditCardId],
    CC.[ActivityId],
    CC.[TransactionDateTime],
FROM 
    dbo.[CreditCard] CC WITH(NOLOCK)
WHERE 
    CC.[ActivityId] = 66
    AND CC.[VANTransactionDateTime] >= @ReportStartDate
    AND CC.[VANTransactionDateTime] < @ReportEndDate

但是,我需要修改查询以从ActivityId 6行而不是从ActivityId 66行输出TransactionDateTime。其他所有内容都需要来自ActivityId 66行。 6和66行都具有相同的卡ID和相同的TransactionId。

我相信可以这样实现:插入不同的CardID,通过CardID和TransactionId将它们分组到临时表中,然后使用它来提取第6行。但是我想知道是否可以通过将聚合函数与group by一起使用来在单个查询操作中完成此操作。

任何帮助都会很棒!

谢谢

4 个答案:

答案 0 :(得分:0)

我建议您使用子查询来解决此问题

SELECT 
    CC.[CreditCardId],
    CC.[ActivityId],
    (SELECT TransactionDateTime 
     FROM dbo.[CreditCard] AS cs 
     WHERE Cs.[ActivityId] = 6 and cs.CardId = cc.CardId) AS [TransactionDateTime]
FROM 
    dbo.[CreditCard] CC WITH(NOLOCK)
WHERE 
    CC.[ActivityId] = 66
    AND CC.[VANTransactionDateTime] >= @ReportStartDate
    AND CC.[VANTransactionDateTime] < @ReportEndDate

尝试举一些例子,有时候很难猜出你想要什么,我希望这对你有用。

答案 1 :(得分:0)

您需要使用汇总和分组依据:

您可以使用min activityID,因为它具有相同的CC.historyid,
    CC。[CreditCardId]和 对于transactiondate,您需要使用maximum,以便为您提供活动ID 66的日期

SELECT 
    CC.historyid,    
    CC.[CreditCardId],
    min(CC.[ActivityId]) as activityid,
    max(CC.[TransactionDateTime]) as TransactionDateTime,
FROM 
    dbo.[CreditCard] CC WITH(NOLOCK)
WHERE 
    CC.[historyId] = '393506845'
    AND CC.[VANTransactionDateTime] >= @ReportStartDate
    AND CC.[VANTransactionDateTime] < @ReportEndDate
GROUP BY 
    CC.historyid, CC.[CreditCardId]

答案 2 :(得分:-1)

我没有任何数据可用于测试,但是您可以尝试使用

{{1}}

答案 3 :(得分:-1)

在条件中使用嵌套选择之前,您可以使用嵌套选择并对其进行简单转换

选择...从    (       选择 ...,           LEN([ActivityId])= 1时的情况然后以CONCAT('0',[ActivityId])ELSE CAST([ActivityId] AS VARCHAR())END AS ActivityId from dbo.CreditCard)作为CC WHERE CC.ActivityId = '06';