2015-11-21 3 views
4

Я ищу помощь, запрашивающую вывод сообщений моего приложения. У меня есть запрос, который берет строки каждого сообщения и объединяет их вместе для формирования предложения. Однако некоторые из моих сообщений имеют два или более сообщения, в этом случае я хочу только сообщение с самой новой датой. Мой текущий код выводит все сообщения в предложение, объединяя номера строк вместе для каждого номера сообщения и вызывая их по порядку по MSG_NUM. Я добавил упорядочение по MSG_START_DATE, но, как и ожидалось, все равно дает мне обоим. Как я могу сделать max для каждой линии конкатенированных сообщений?Строки SQL concat с одинаковым идентификатором и самой новой датой

Вот поля, я работаю с:

MSG_NUM | MSG_START_DATE | MSG_LINE_NUM | MSG_TEXT 

1  | 2010-01-15  | 1   | Invalid operation 
1  | 2010-01-15  | 2   | try again 
1  | 2014-02-21  | 1   | Invalid input 
1  | 2014-02-21  | 2   | try again 

Вот мой текущий код:

Select distinct ST2.[MSG_NUM], 
substring(
    (
     (Select ' '+LTRIM(RTRIM(ST1.[MSG_TEXT])) AS [text()] 
     From database..messages ST1 
     Where ST1.[MSG_NUM] = ST2.[MSG_NUM] 
     ORDER BY ST1.[MSG_START_DATE], ST1.[MSG_LINE_NUM] 
     For XML PATH (''),root('xmlchar'), type).value('/xmlchar[1]','varchar(max)') 
    ), 2, 2000) [Message] 
From database..messages ST2 order by ST2.[MSG_NUM] 

А вот выход я получаю:

1 Invalid повторите попытку Неправильный вход повторите попытку

Я хочу только вывод:

1 Invalid вход попробуйте еще раз

Любые идеи о том, как я могу это сделать?

+0

Всегда старайтесь включать РСУБД тег для SQL вопросы 'SqlServer',' MySql' ?. Некоторые функции доступны для всех баз данных. –

+0

Добавлено! (SQL Server 2012) – Ryan

ответ

2

Как насчет фильтрации по дате?

Select distinct ST2.[MSG_NUM], 
substring(
    (
     (Select ' '+LTRIM(RTRIM(ST1.[MSG_LINE_NUM])) AS [text()] 
     From database..messages ST1 
     Where ST1.[MSG_NUM] = ST2.[MSG_NUM] 
      AND ST1.[MSG_START_DATE] = (SELECT MAX(ST3.[MSG_START_DATE]) 
             FROM database..messages ST3 
             WHERE ST2.[MSG_NUM] = ST3.[MSG_NUM] 
            ) 
     ORDER BY ST1.[MSG_LINE_NUM] 
     For XML PATH (''),root('xmlchar'), type).value('/xmlchar[1]','varchar(max)') 
    ), 2, 2000) [Message] 
From database..messages ST2 order by ST2.[MSG_NUM] 

еще лучше, просто фильтровать перед передачей на ваш запрос

WITH maxd 
AS (
    SELECT * 
     ,MAX(MSG_START_DATE) OVER (PARTITION BY [MSG_NUM]) AS maxdate 
    FROM DATABASE..messages 
    ) 
    ,filter 
AS (
    SELECT * 
    FROM maxd 
    WHERE MSG_START_DATE = maxdate 
    ) 
SELECT DISTINCT ST2.[MSG_NUM] 
    ,substring((
      (
       SELECT ' ' + LTRIM(RTRIM(ST1.[MSG_LINE_NUM])) AS [text()] 
       FROM filter ST1 
       WHERE ST1.[MSG_NUM] = ST2.[MSG_NUM] 
       ORDER BY ST1.[MSG_LINE_NUM] 
       FOR XML PATH('') 
        ,root('xmlchar') 
        ,type 
       ).value('/xmlchar[1]', 'varchar(max)') 
      ), 2, 2000) [Message] 
FROM filter ST2 
ORDER BY ST2.[MSG_NUM] 
+0

Вау! Вот так! Спасибо! Я сделал небольшую ошибку, и LTRIM (RTRIM (ST1. [MSG_LINE_NUM]) на самом деле должен быть [MSG_TEXT], но спасибо вам спасибо! Остальное сработало! – Ryan

+0

Вы использовали первую или вторую версию? –

+0

Я попробовал оба, закончил тем, что пошел первым. Второй провел более двух минут, прежде чем я отменил его. – Ryan

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