Поиск последнего месяца, года, включая другие поля - PullRequest
0 голосов
/ 16 февраля 2012

Таблица1 выглядит следующим образом:

Name    Number  Month   Year    Fee_Paid
Ravi    1       1       2010    100
Raju    2       1       2010    200
Kumar   3       1       2010    300
Ravi    1       2       2011    100
Raju    2       2       2011    200
Kumar   3       2       2011    300
Ravi    1       3       2012    100
Raju    2       3       2012    200
Kumar   3       3       2012    300

Результат должен быть следующим:

Name    Number  Month   Year    Fee_Paid
Ravi    1       3       2012    100
Raju    2       3       2012    200
Kumar   3       3       2012    300

В результате должны отображаться последний год и месяц, включая имя, номер и плату_плату в этомпериод.Пожалуйста, помогите мне.

Ответы [ 3 ]

1 голос
/ 16 февраля 2012

Это решение не от CTE:

select HighestYear.* from (
  select v1.* from visitors v1
  left join visitors v2
  on v1.number = v2.number and v1.year < v2.year
  where v2.year is null
) HighestYear
left join visitors v3
on HighestYear.number = v3.number and HighestYear.year = v3.year
and HighestYear.month < v3.month
where v3.month is null

Пример с дополнительными данными

1 голос
/ 16 февраля 2012

Если вам нужна последняя строка для каждого имени, независимо от того, какой месяц был их в прошлом месяце:

;WITH x AS 
(
    SELECT Name, Number, [Month], [Year], [Fee_Paid],
      rn = ROW_NUMBER() OVER 
      (PARTITION BY Name ORDER BY [Year] DESC, [Month] DESC)
    FROM dbo.Table1
)
SELECT Name, Number, [Month], [Year], [Fee_Paid]
FROM x
WHERE rn = 1
ORDER BY Number;

Если вы хотите, чтобы все строки из последнего комбинированного набора год / месяц были найдены независимо от имени, запрос будет немного отличаться:

;WITH x AS 
(
    SELECT Name, Number, [Month], [Year], [Fee_Paid],
      rn = DENSE_RANK() OVER (ORDER BY [Year] DESC, [Month] DESC)
    FROM #x
)
SELECT Name, Number, [Month], [Year], [Fee_Paid]
FROM x
WHERE rn = 1
ORDER BY Number;

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

0 голосов
/ 16 февраля 2012
SELECT
   Details.Name,
   Details.Number,
   Details.Month,
   Details.Year,
   Details.Fee_Paid
FROM
   (
   SELECT
      Name,
      MAX(Year) AS Year,
      MAX(Month) AS Month
   ) AS MaxValues
INNER JOIN MyTable AS Details ON
   Details.Name = MaxValues.Name
   AND Details.Year = MaxValues.Year
   AND Details.Month = MaxValues.Month
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...