如何针对两个联合的select语句创建顺序编号?

时间:2015-11-20 18:35:25

标签: sql-server tsql salesforce

我有一个SQL查询,它只是两个SELECT语句之间的联合。假设整个查询的结果产生10条记录。我希望作为结果集的一部分设置一个数字和顺序的列(如主键 - 0,1,2,3,依此类推)。我的问题是我编码的方式,如下所示,不会产生唯一值(0值重复两次,1值重复两次,正如预期的那样,因为union语句)。如何获得以下"交易序列号"显示1,2,3,4,5,6,7,8,9,10?而不是1,2,3,4,5,1,2,3,4,5?

这是我的代码(下方)。我将很快发布我的结果集的屏幕截图 - SQL Server现在对我来说速度非常慢 - 我希望这没有结果集的屏幕截图是有道理的:

select top 5
    'ACCT PROMORESP' as 'Transaction Identifier',
    row_number() over (order by s.HL_ACCT_ID) as 'Transaction Sequence Number',
    s.HL_ACCT_ID as 'HL_Acct_ID',
    null as [AcctNumber],
    null as [AcctType],
    null as [AcctSource],
    null as [DUNS_NBR],
    null as [DBPLCR_CONTACT_ID],
    s.CAMPAIGNCODE as [CellCode],
    '-1' as [OfferCode],
    case
        when c.EventDate is not null then 'Click'
        when c.EventDate is null then
        case 
            when sub.status = 'unsubscribed' then 'Unsubscribe'
            when sub.status = 'bounced' then 'Bounce'
            when sub.status = 'held' then 'Bounce'
        end
    end as [ResponseType],
    convert(varchar, c.EventDate, 112) as [ResponseDate],
    null as [ResponseQuantity],
    null as [ResponseValue],
    'Email' as [ResponseChannel],
    null as [Cookie ID],
    null as [IP address],
    null as [Device ID],
    null as [CUSTOM_TEXT_01],
    null as [CUSTOM_TEXT_02],
    null as [CUSTOM_TEXT_03],
    null as [CUSTOM_TEXT_04],
    null as [CUSTOM_TEXT_05]
from cXXXXXXX.sendlog s with (nolock)
inner join cXXXXXXX._subscribers sub with (nolock) on sub.SubscriberKey = s.Email
left join cXXXXXXX._click c with (nolock) on c.JobID = s.JobID and c.SubscriberKey = s.Email
where c.EventDate is not null or (c.EventDate is null and (sub.status = 'unsubscribed' or sub.status = 'bounced' or sub.status = 'held')) and c.isunique = 1

union all

select top 5
    'ACCT PROMORESP' as 'Transaction Identifier',
    (row_number() over (order by s.HL_ACCT_ID)) + 1 as 'Transaction Sequence Number',
    s.HL_ACCT_ID as 'HL_Acct_ID',
    null as [AcctNumber],
    null as [AcctType],
    null as [AcctSource],
    null as [DUNS_NBR],
    null as [DBPLCR_CONTACT_ID],
    s.CAMPAIGNCODE as [CellCode],
    '-1' as [OfferCode],
    case
        when o.EventDate is not null then 'Message Open'
        when o.EventDate is null then
        case 
            when sub.status = 'unsubscribed' then 'Unsubscribe'
            when sub.status = 'bounced' then 'Bounce'
            when sub.status = 'held' then 'Bounce'
        end
    end as [ResponseType],
    convert(varchar, o.EventDate, 112) as [ResponseDate],
    null as [ResponseQuantity],
    null as [ResponseValue],
    'Email' as [ResponseChannel],
    null as [Cookie ID],
    null as [IP address],
    null as [Device ID],
    null as [CUSTOM_TEXT_01],
    null as [CUSTOM_TEXT_02],
    null as [CUSTOM_TEXT_03],
    null as [CUSTOM_TEXT_04],
    null as [CUSTOM_TEXT_05]
from cXXXXXXX.sendlog s with (nolock)
inner join cXXXXXXX._subscribers sub with (nolock) on sub.SubscriberKey = s.Email
left join cXXXXXXX._open o with (nolock) on o.JobID = s.JobID and o.SubscriberKey = s.Email
where o.EventDate is not null or (o.EventDate is null and (sub.status = 'unsubscribed' or sub.status = 'bounced' or sub.status = 'held'))  and o.isunique = 1

2 个答案:

答案 0 :(得分:3)

您可以将sql包含在公用表表达式中,然后对它们进行编号:

;WITH CTE AS(your sql...)
SELECT *,
 (row_number() over (order by HL_ACCT_ID)) + 1 as 'Transaction Sequence Number'
FROM CTE

您必须确保cte中有唯一的列名。此外,如果您将此sql语句与其他语句一起使用,请确保添加&#39 ;;'在它之前或结束之前的声明与&#39 ;;'。

答案 1 :(得分:3)

尝试使用它。

SELECT ROW_NUMBER() OVER(ORDER BY DATA.HL_ACCT_ID),DATA.* FROM 
(your query here...)DATA