Então eu tenho uma tabela assim
id | date1 |date2 |value
1 | 1/1/2014|1/1/2004|100
1 | 1/1/2014|1/1/2004|100
1 | 1/1/2014|1/1/2009|200
1 | 1/1/2014|1/1/2009|200
1 | 1/1/2014|1/1/2016|300
1 | 1/1/2015|1/1/2004|100
1 | 1/1/2015|1/1/2004|100
1 | 1/1/2015|1/1/2009|200
1 | 1/1/2015|1/1/2009|200
1 | 1/1/2015|1/1/2016|300
1 | 1/1/2017|1/1/2004|100
1 | 1/1/2017|1/1/2004|100
1 | 1/1/2017|1/1/2009|200
1 | 1/1/2017|1/1/2009|200
1 | 1/1/2017|1/1/2016|300
NOTA: Os valores de valor col podem ser aleatórios
Como obtenho as linhas com date1>=date2 em vários ids.
Essencialmente, se date1 for 2014, quero obter apenas a linha em que date1-date2 é mínimo, mas não negativo.
O resultado da tabela de exemplo ficaria assim:
id | date1 |date2 |value
1 | 1/1/2014|1/1/2009|200
1 | 1/1/2015|1/1/2009|200
1 | 1/1/2017|1/1/2016|300
Espero ter explicado bem, se não, fique a vontade para perguntar.
Estou usando o MS SQL SERVER 2014
até agora tentei:
select id,date1,min(date2) over (partition by id,date1 order by id, date1) date2, value
from tblA
Isso me dá:
id | date1 |date2 |value
1 | 1/1/2014|1/1/2004|100
1 | 1/1/2014|1/1/2004|100
1 | 1/1/2014|1/1/2004|200
1 | 1/1/2014|1/1/2004|200
1 | 1/1/2014|1/1/2004|300
1 | 1/1/2015|1/1/2004|100
1 | 1/1/2015|1/1/2004|100
1 | 1/1/2015|1/1/2004|200
1 | 1/1/2015|1/1/2004|200
1 | 1/1/2015|1/1/2004|300
1 | 1/1/2017|1/1/2004|100
1 | 1/1/2017|1/1/2004|100
1 | 1/1/2017|1/1/2004|200
1 | 1/1/2017|1/1/2004|200
1 | 1/1/2017|1/1/2004|300
Aqui está um link para mexer com a mesa
Acho que o que você quer fazer é classificar os dados com base na menor diferença entre as datas, por ano - mas você só precisa considerar as linhas em que
date1
é maior quedate2
. Para isso, eu pessoalmente usaria um CTE para filtrar e classificar os resultados antes de devolvê-los assim:Você pode encontrar os resultados em dbfiddle .
Para mais informações consulte a documentação oficial do RANK e CTE .