2013-02-20 2 views
2

У меня есть две таблицы: Study и Activity_History. Деятельность работает на исследованиях, поэтому существует соотношение 1: много.Использование нескольких столбцов в подзапросе SQL

Я хочу, чтобы иметь возможность запускать SQL-запрос в таблице Activity_History, которая будет получать активность и предыдущую активность. В настоящее время у меня есть это:

SELECT 
     * 
FROM Activity_History AS A1 
LEFT JOIN Activity_History AS A2 
ON A2.Parent_Study_ID = 
(
    SELECT TOP 1 Parent_Study_ID 
    FROM Activity_History AS A3 
    WHERE A3.Parent_Study_ID = A1.Parent_Study_ID 
      AND A3.Activity_Date < A1.Activity_Date 
    ORDER BY Activity_Date DESC 
) 

Это не работает. Что происходит, так это то, что вытягивание участника Activity_Date запроса не имеет эффекта, и оно просто возвращает первое совпадающее значение Activity_Date в порядке убывания даты для каждой строки. Я думаю, что это происходит, потому что в моем подзапросе я использую Activity_Date в том месте, но это не в подзапросе.

Спасибо за помощь!

+0

пожалуйста, вы можете добавить схему таблицы, столбцы имя – dekdev

+0

Что «* Это не работает *» означает? – RBarryYoung

+1

Вам не нужно включать все столбцы в '' WHERE' в ваш 'SELECT' ... какая ошибка вы получаете? –

ответ

3

Я предполагаю, что вы используете SQL Server? Если это так, то это должно работать, используя ROW_NUMBER():

WITH CTE AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Parent_Study_Id ORDER BY Activity_Date) RN 
    FROM Activity_History 
    ) 
SELECT * 
FROM CTE T1 
    LEFT JOIN CTE T2 ON T1.RN = T2.RN+1 AND T1.Parent_Study_Id = T2.Parent_Study_Id 

А вот SQL Fiddle.

+1

Правильное выражение: 'row_number() over (partition by parent_study_id order by activity_date)'. –

+0

@GordonLinoff - спасибо, не видел этого в оригинальном запросе - работал на Fiddle и пошел слишком быстро! Благодаря! – sgeddes

+0

Удивительный, отлично работает. Row_Number() - очень крутая функция. –

0

В SQLServer2005 + вместо LEFT JOIN вам нужно использовать OUTER APPLY

SELECT * 
FROM Activity_History AS A1 OUTER APPLY ( 
             SELECT TOP 1 Parent_Study_ID 
             FROM Activity_History AS A2 
             WHERE A2.Parent_Study_ID = A1.Parent_Study_ID 
              AND A2.Activity_Date < A1.Activity_Date 
             ORDER BY A2.Activity_Date DESC 
             ) o 
Смежные вопросы