Есть предложения по исследованию. Решения принимаются по предложениям. Решения могут быть всего 4-х типов. Мне нужно отображать последнее решение по всем рассмотренным предложениям, связанным с конкретным исследователем. Вот что у меня есть на данный момент:

SELECT p.ProposalID
    ,p.Title
    ,p.DATE
    ,p.Submitted
    ,p.ReviewCompleted
    ,d.DecisionID
    ,dt.Description AS Decision
FROM Proposal p
LEFT JOIN (
    SELECT TOP 1 *
    FROM Decision
    ORDER BY DATE
    ) d
    ON d.ProposalID = p.ProposalID
LEFT JOIN DecisionType dt
    ON dt.DecisionTypeID = d.DecisionTypeID
WHERE p.ReviewCompleted = '1'
    AND p.ProposalID IN (
        SELECT ProposalID
        FROM Proposal
        WHERE ResearcherID = ?
        )
ORDER BY d.DATE

Я понимаю, что проблема возникает из-за первого левого соединения, но я не могу понять, как получить последнее решение по p.ProposalID. Огромное спасибо заранее.

sql
2
Alex Bariyev 20 Апр 2016 в 16:55

2 ответа

Лучший ответ

Похоже, вы используете MSSQL (если да, добавьте его в теги). В этом случае перепишите это ЛЕВОЕ СОЕДИНЕНИЕ, используя функцию ROW_NUMBER ():

LEFT JOIN (
    SELECT TOP 1 *
    FROM Decision
    ORDER BY DATE
    ) d
    ON d.ProposalID = p.ProposalID

К

LEFT JOIN (
    SELECT Decision.*, 
    ROW_NUMBER() OVER(PARTITION BY ProposalID ORDER BY DATE DESC) AS Row_num
    FROM Decision
    ) d
    ON (d.ProposalID = p.ProposalID)
       AND (Row_num = 1)

Здесь нужно рассчитать номера строк для каждой группы и отсортировать по дате. Затем выберите только первое (Row_num = 1) для каждой группы.

1
valex 20 Апр 2016 в 14:06

Вы также можете написать этот запрос, используя OUTER APPLY:

FROM Proposal p OUTER APPLY
     (SELECT TOP 1 *
      FROM Decision d
      WHERE d.ProposalID = p.ProposalID
      ORDER BY DATE DESC
     ) d LEFT JOIN
     DecisionType dt
     ON dt.DecisionTypeID = d.DecisionTypeID

OUTER APPLY - это реализация SQL Server «бокового соединения». Иногда запросы с использованием APPLY имеют преимущество в производительности.

1
Gordon Linoff 20 Апр 2016 в 16:04