Вернуть только строки из объединенной таблицы с самой последней датой

not необходимо поместить реализацию в файл заголовка, см. альтернативное решение в конце этого ответа.

В любом случае причина, по которой ваш код не работает, что при создании экземпляра шаблона компилятор создает новый класс с заданным аргументом шаблона. Например:

template
struct Foo
{
    T bar;
    void doSomething(T param) {/* do stuff using T */}
};

// somewhere in a .cpp
Foo f; 

При чтении этой строки компилятор создаст новый класс (назовем его FooInt), что эквивалентно следующему:

struct FooInt
{
    int bar;
    void doSomething(int param) {/* do stuff using int */}
}

Следовательно, компилятор должен иметь доступ к реализации методов, чтобы создать экземпляр с аргументом шаблона (в данном случае int). Если эти реализации не были в заголовке, они не были бы доступны, поэтому компилятор не смог бы создать экземпляр шаблона.

Общим решением для этого является запись объявления шаблона в заголовок файла, затем реализовать класс в файле реализации (например, .tpp) и включить этот файл реализации в конец заголовка.

// Foo.h
template 
struct Foo
{
    void doSomething(T param);
};

#include "Foo.tpp"

// Foo.tpp
template 
void Foo::doSomething(T param)
{
    //implementation
}

Таким образом, реализация по-прежнему отделена от объявления, но доступен компилятору.

Другое решение состоит в том, чтобы сохранить реализацию отдельно и явно создать все экземпляры шаблона, которые вам понадобятся:

// Foo.h

// no implementation
template  struct Foo { ... };

//----------------------------------------    
// Foo.cpp

// implementation of Foo's methods

// explicit instantiations
template class Foo;
template class Foo;
// You will only be able to use Foo with int or float

Если мое объяснение isn ' t достаточно ясно, вы можете взглянуть на C ++ Super-FAQ по этому вопросу .

0
задан disasterkid 3 March 2019 в 17:06
поделиться

2 ответа

Обратите внимание, что ваш отдельный запрос относится к выбранным переменным, например
. Данные 1 (QueryExecutionId = 169237 и typename = test 1)
& ensp; & ensp; & ensp; Данные 2 (QueryExecutionId = 169237 и typename = test 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
ответ дан Joe 3 March 2019 в 17:06
поделиться

Вы можете использовать производную таблицу с 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;
0
ответ дан Zohar Peled 3 March 2019 в 17:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: