Вернуть только строки из объединенной таблицы с самой последней датой - PullRequest
0 голосов
/ 03 марта 2019

Запустив следующий запрос, я понял, что у меня есть дубликаты в столбце QueryExecutionId.

SELECT DISTINCT qe.QueryExecutionid AS QueryExecutionId,
    wfi.workflowdefinitionid AS FlowId,
    qe.publishing_date AS [Date],
    c.typename AS [Type],
    c.name As Name
INTO #Send
FROM
    [QueryExecutions] qe  
    JOIN [Campaign] c ON qe.target_campaign_id = c.campaignid
    LEFT JOIN [WorkflowInstanceCampaignActivities] wfica ON wfica.queryexecutionresultid = qe.executionresultid
    LEFT JOIN [WorkflowInstances] wfi ON wfica.workflowinstanceid = wfi.workflowinstanceid
WHERE qe.[customer_idhash] IS NOT NULL;

Например, при тестировании с одним из этих QueryExecutionIds я могу получить два результата

select * from ##Send
where QueryExecutionId = 169237

Мы поняли, что причина в том, что эти две строки имеют разные FlowId (второе возвращаемое значение в первом запросе).Обсудив эту проблему, мы решили взять запись с FlowId с самой поздней датой.Эта дата представляет собой столбец с именем lastexecutiontime, который находится в третьей объединенной таблице [WorkflowInstances], которая также является таблицей, откуда берется FlowId.

Как получить только уникальные значения QueryExecutionId с последним значениемWorkflowInstances.lastexecution времени и удалить дубликаты?

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Обратите внимание, что ваш отдельный запрос относится к выбранным переменным,
например.Данные 1 (QueryExecutionId = 169237 и typename = тест 1)
Данные 2 (QueryExecutionId = 169237 и typename = тест 2)
Вышеуказанные 2 данные считаются различными

Попробуйте разделить и выбрать[seq] = 1 (приведенный ниже код разделен по дате)

SELECT *
    into #Send
    FROM
    (
           SELECT *,ROW_NUMBER() OVER (PARTITION BY [QueryExecutionid] ORDER BY [Date] DESC) [Seq]  
           FROM
           (
                  SELECT    qe.QueryExecutionid AS QueryExecutionId,
                            wfi.FlowId,
                            qe.publishing_date AS [Date], --should not have any null values
                            qe.[customer_idhash]
                            c.typename AS [Type],
                            c.name As Name

                  FROM [QueryExecutions] qe  
                  JOIN [Campaign] c 
                  ON qe.target_campaign_id = c.campaignid
                  LEFT JOIN [WorkflowInstanceCampaignActivities] wfica 
                  ON wfica.queryexecutionresultid = qe.executionresultid
                  LEFT JOIN 
                    (
                        SELECT DISTINCT workflowinstanceid, FIRST_VALUE(workflowdefinitionid) OVER(PARTITION BY workflowinstanceid ORDER BY lastexecutiontime DESC) As FlowId
                        FROM [WorkflowInstances]
                    ) wfi ON wfica.workflowinstanceid = wfi.workflowinstanceid

           ) a
           WHERE [customer_idhash] IS NOT NULL
    ) b
    WHERE [Seq] = 1 
    ORDER BY [QueryExecutionid]
0 голосов
/ 03 марта 2019

Вы можете использовать производную таблицу с first_value, разделенным на workflowinstanceid, упорядоченным по lastexecutiontime desc:

SELECT DISTINCT qe.QueryExecutionid AS QueryExecutionId,
    wfi.FlowId,
    qe.publishing_date AS [Date],
    c.typename AS [Type],
    c.name As Name
INTO #Send
FROM
    [QueryExecutions] qe  
    JOIN [Campaign] c ON qe.target_campaign_id = c.campaignid
    LEFT JOIN [WorkflowInstanceCampaignActivities] wfica ON wfica.queryexecutionresultid = qe.executionresultid
    LEFT JOIN 
    (
        SELECT DISTINCT workflowinstanceid, FIRST_VALUE(workflowdefinitionid) OVER(PARTITION BY workflowinstanceid ORDER BY lastexecutiontime DESC) As FlowId
        FROM [WorkflowInstances]
    ) wfi ON wfica.workflowinstanceid = wfi.workflowinstanceid
WHERE qe.[customer_idhash] IS NOT NULL;
...