2016-05-06 3 views
1

Я управляю государственным приложением и использую Tableau для создания визуализации данных.SQL Server 2012 Макс. Дата в подзапросе в объединенной таблице

Мне было поручено создать визуализацию, показывающую, сколько времени проходит между контактами и сегодня (Case Note Dates). Я знаю, как изолировать максимальную дату случае примечание в таблице случае примечание:

Select 
    [Case_Master_ID], 
    [Case_Note_Date], 
    [Case_Note_Category_Desc], 
    [Case_Note_Summary_Narr] 
From 
    buCase_Note 
Where 
    Case_Note_Date = (Select MAX(Case_Note_Date) 
         From buCase_Note) 

Этот запрос покажет мне, что максимальный случай отмечает в таблице с сегодняшнего дня. Проблема в том, что мне нужно показать максимальную заметку для всех участников, а не только сегодняшних. Исходный запрос я использую для просмотра дела Замечаний:

Select 
    vc.[_Case Master ID], 
    vc.[_Caseload Assignment Current], 
    vc.[_Participant Name], 
    vc.[Case Status], 
    vc.[Reporting Structure Level 4], 
    vc.[Reporting Structure Level 5], 
    vc.[Application Date], 
    vc.[Eligibility Date], 
    vc.[Eligibility Determination Extension Date], 
    vc.[Eligibility Extended To Date], 
    vc.[Days in Application], 
    cn.[Case_Note_Date], 
    cn.[Case_Note_Category_Desc], 
    cn.[Case_Note_Summary_Narr] 
From 
    biVR_Cases vc 
Left outer Join 
    buCase_Note cn ON cn.Case_Master_ID = vc.[_Case Master ID] 

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

Where cn.[Case_Note_Date] = (
    Select 
     MAX(cn.Case_Note_Date) 
    From buCase_Note) 

Я получаю следующее сообщение об ошибке SSMS 2012:

Агрегат не может появиться в ИНЕКЕ, если оно не находится в подчиненном запросе, содержащейся в предложении HAVING или списке выбора, а агрегированный столбец является внешней ссылкой.

Я ищу, чтобы сохранить bi таблицы слева при успешном присоединении в таблице историй болезни и приносить только в последнем случае примечания на каждом участник.

Добавление деталей: Конечно, Вот пример данных, я получаю при выполнении следующего запроса:

Select 
vc.[_Case Master ID], 
vc.[_Caseload Assignment Current], 
vc.[_Participant Name], 
cn.[Case_Note_Date], 
From biVR_Cases vc 
LEFT outer JOIN buCase_Note cn ON vc.[_Case Master ID] = cn.Case_Master_ID 

_Caseload назначения текущего испытания Участник Имя Casenote Дата Тест Утешитель Участнику 29 сентября, 2010 23 сентября 2010 года 30 августа 2010 года 30 июня 2010 года 1 июня 2010 года

Таблица битов содержит информацию о пользователе, такую ​​как имя, приложение, идентификатор ведущего устройства и т. Д. Таблица casenote содержит идентификатор ведущего устройства, а также соединение. Он также содержит даты, когда каждая запись создается. Поэтому для набора данных выше, я пытаюсь привести только последний случай для каждого участника. Я включил только 1 в образец выше, но у нас более 15 000. У каждого участника будет много заметок. Я пытаюсь захватить верхний casenote, поэтому я могу рассчитать разницу дат между последней записью к делу и сегодня для каждого участника. Когда я добавляю:

Where cn.[Case_Note_Date] = (Select 
top 1 [Case_Note_Date] 
From buCase_Note 
Order by 1 DESC)) 
OR 
Where Case_Note_Date=(
Select 
MAX(Case_Note_Date) 
From buCase_Note) 

Это только показывает верхний или максимальный casenote для участников, которые имели casenote созданный сегодня. Вместо того, чтобы показывать max casenote в таблице casenote, мне нужен максимальный шанс для каждого участника. Надеюсь, это имеет смысл.

+0

Вы должны показать некоторые данные. Ваш MAX (cn.Case_Note_Date) вернет только один данные из buCase_Note, не один за [_Case Master ID] – Chuck

ответ

1

Вы могли бы попробовать что-то вроде того, что я включил ниже. Без фактических данных я не знаю, достаточно ли это для вас, но он должен работать. Однако, если вы получите лучший ответ, я бы с удовольствием это узнал.

Select vc.[_Case Master ID], 
vc.[_Caseload Assignment Current], 
vc.[_Participant Name], 
vc.[Case Status], 
vc.[Reporting Structure Level 4], 
vc.[Reporting Structure Level 5], 
vc.[Application Date], 
vc.[Eligibility Date], 
vc.[Eligibility Determination Extension Date], 
vc.[Eligibility Extended To Date], 
vc.[Days in Application], 
cn.[Case_Note_Date], 
cn.[Case_Note_Category_Desc], 
cn.[Case_Note_Summary_Narr] 
From biVR_Cases vc 
LEFT outer JOIN 
    (SELECT Case_Master_ID, Case_Note_Date, Case_Note_Category_Desc, Case_Note_Summar_Narr, 
      ROW_NUMBER() OVER (PARTITION BY Case_Master_ID ORDER BY Case_Note_Date DESC) as RowNum FROM buCase_Note) cn 
    ON cn.Case_Master_ID = vc.[_Case Master ID] AND cn.RowNum=1 
+0

Ничего себе, это сработало отлично. Я хотел бы услышать объяснение логики, но не хочу больше тратить ваше время. Спасибо! – Mike

+0

Вы можете попробовать прочитать ROW_NUMBER() и предложение OVER. Основная идея заключается в том, что это дает номер каждой записи с тем же Case_Master_ID в порядке убывания Case_Note_Date. Самая последняя дата для каждого Case_Master_ID будет иметь значение RowNum равное 1. Я не утверждаю, что это самый эффективный метод, но он работает. –

0

Удалить cn. из строки MAX(cn.Case_Note_Date). Вы не хотите ссылаться на столбец из основного запроса. Вы просто хотите выбрать Case_Note_Date от buCase_Note.

Таким образом, весь запрос будет

Select 
vc.[_Case Master ID], 
vc.[_Caseload Assignment Current], 
vc.[_Participant Name], 
vc.[Case Status], 
vc.[Reporting Structure Level 4], 
vc.[Reporting Structure Level 5], 
vc.[Application Date], 
vc.[Eligibility Date], 
vc.[Eligibility Determination Extension Date], 
vc.[Eligibility Extended To Date], 
vc.[Days in Application], 
cn.[Case_Note_Date], 
cn.[Case_Note_Category_Desc], 
cn.[Case_Note_Summary_Narr] 
From biVR_Cases vc 
LEFT outer JOIN buCase_Note cn ON cn.Case_Master_ID = vc.[_Case Master ID] 
Where cn.[Case_Note_Date] = (Select 
MAX(Case_Note_Date) 
From buCase_Note) 
+0

Hi J.kasper, спасибо за быстрый ответ. Предлагаемая корректировка сделала запрос пройденным. У меня все еще есть такая же проблема, как и раньше, но она по-прежнему только снимает заметки с сегодняшнего дня. Есть ли другой способ получить самый последний случай для каждого участника, даже если последний случай был от 4 месяцев назад? Еще раз спасибо, что нашли время, чтобы посмотреть на это. – Mike

+0

@Mike Можете ли вы указать определение двух таблиц и некоторых выборочных данных? Было бы намного проще придумать решение –

+0

Я добавил детали к моему оригинальному вопросу. Похоже, что не форматирование экспорта Excel. По сути, у участника будет соотношение между 1 и многими отношениями с casenotes. 1 участник и многие казны с течением времени. Цель состоит в том, чтобы изолировать верхний или максимальный касенот, чтобы я мог провести расчет разницы дат между самой последней датой казнета и сегодня, независимо от того, что сегодня происходит, когда оно выполняется. – Mike

Смежные вопросы