Выберите самые последние даты из группы - PullRequest
0 голосов
/ 31 августа 2018

Мне нужно найти самую последнюю дату апелляции для каждой записи в нашей базе данных, я пытался использовать Макс (дата), но она все равно дает мне все наши составные части оценки, чем только один ряд последней даты Я использую MS SQL

    SELECT 
    [Constituent ID]
      ,[Assigned Appeal Category]
      ,[Assigned Appeal ID]**strong text**
      ,[Assigned Appeal Response]
      ,MAX([Assigned Appeal Date])


  FROM [FHF_MarketingData].[dbo].[FHF_Constituent_Appeals]

  WHERE [Assigned Appeal Category] = 'TELEMARKETING'



GROUP BY 
    [Constituent ID],
    [Assigned Appeal Category],
    [Assigned Appeal ID],
    [Assigned Appeal Response],
    [Assigned Appeal Date]

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

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

 SELECT [Constituent ID]
        ,[Assigned Appeal Category]
        ,[Assigned Appeal ID]
        ,[Assigned Appeal Response]
        ,MaxDt
    FROM [FHF_MarketingData].[dbo].[FHF_Constituent_Appeals] CA
    INNER JOIN (
        SELECT  MAX([Assigned Appeal Date]) MaxDT
            ,[Constituent ID]
        FROM [FHF_MarketingData].[dbo].[FHF_Constituent_Appeals]
        WHERE [Assigned Appeal Category] = 'TELEMARKETING'
        GROUP BY [constituent id]
        ) MaxDt ON MaxDt.[Constituent ID] = CA.[Constituent ID]
0 голосов
/ 31 августа 2018

Вы можете использовать ROW_NUMBER() и TOP (1) WITH TIES для этого:

SELECT TOP (1) WITH TIES ca.*
FROM [FHF_MarketingData].[dbo].[FHF_Constituent_Appeals] ca
WHERE ca.[Assigned Appeal Category] = 'TELEMARKETING'
ORDER BY ROW_NUMBER() OVER (PARTITION BY [Constituent ID] ORDER BY [Assigned Appeal Date] DESC);

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

Другой метод, который может даже иметь лучшую производительность с правильными индексами:

SELECT ca.*
FROM [FHF_MarketingData].[dbo].[FHF_Constituent_Appeals] ca
WHERE ca.[Assigned Appeal Category] = 'TELEMARKETING' AND
      ca.[Assigned Appeal Date] = (SELECT MAX(ca2.[Assigned Appeal Date])
                                   FROM [FHF_MarketingData].[dbo].[FHF_Constituent_Appeals] ca2
                                   WHERE ca2.[Constituent ID] = ca.[Constituent ID] AND
                                         ca2.[Assigned Appeal Category] = ca.[Assigned Appeal Category]
                                  );
...