while una ultimo ultima traer tabla seleccionar registro recorrer obtener mostrar mayor grupo fecha cada sql-server sql-server-2005 tsql

sql server - una - SQL para devolver la lista de años desde un año específico



traer el ultimo registro de una tabla sql (9)

Necesito una lista de años como un juego de registros desde 2004 hasta el año en curso (en orden de desc), sin escribir un procedimiento almacenado . es posible? (SQL Server 2005). Entonces debería volver:

2009
2008
2007
2006
2005
2004


Actualizado para devolver el año en curso más los 5 años anteriores. Debe ser muy rápido ya que este es un pequeño conjunto de registros.

SELECT YEAR(GETDATE()) as YearNum UNION SELECT YEAR(GETDATE()) - 1 as YearNum UNION SELECT YEAR(GETDATE()) - 2 as YearNum UNION SELECT YEAR(GETDATE()) - 3 as YearNum UNION SELECT YEAR(GETDATE()) - 4 as YearNum UNION SELECT YEAR(GETDATE()) - 5 as YearNum ORDER BY YearNum DESC


Creo que necesita crear una tabla de fechas, luego seleccione su rango. También puede ser útil cuando necesita seleccionar un rango de fechas con X datos adjuntos y no tener días perdidos.


Esta es una consulta simple, revisa esto

(SELECT REPLACE((TO_CHAR(SYSDATE,''YYYY'')-Rownum)+1,'' '',NULL) yr FROM dual CONNECT BY LEVEL < 32) year


Esto lleva todos los años desde 2004 hasta el presente, utilizando un CTE recursivo:

with yearlist as ( select 2004 as year union all select yl.year + 1 as year from yearlist yl where yl.year + 1 <= YEAR(GetDate()) ) select year from yearlist order by year desc;


Prueba esto:

declare @lowyear int set @lowyear = 2004 declare @thisyear int set @thisyear = year(getdate()) while @thisyear >= @lowyear begin print @thisyear set @thisyear = (@thisyear - 1) end

Devoluciones

2009 2008 2007 2006 2005 2004

Cuando llegue al 1 de enero de 2010. Volverá el mismo código:

2010 2009 2008 2007 2006 2005 2004


Usar ROW_NUMBER en cualquier columna de cualquier tabla suficientemente grande (estable) sería una forma de hacerlo.

SELECT * FROM ( SELECT TOP 100 2003 + ROW_NUMBER() OVER (ORDER BY <AnyColumn>) AS Yr FROM dbo.<AnyTable> ) Years WHERE Yr <= YEAR(GETDATE())

Tenga en cuenta que <AnyTable> debe contener al menos la cantidad de filas igual a la cantidad de años que necesita.

Editar (Cudo a Joshua)

  • Preferiblemente, seleccionaría una tabla que sabe que no se truncará ni eliminará. Una system table suficientemente grande debe venir a la mente.
  • En la actualidad, siendo mucho mayor y más sabio (al menos mayor), implementaría este requisito utilizando un CTE como el mencionado en la respuesta dada por Joshua. La técnica CTE es muy superior y menos propensa a errores que la actual solución ROW_NUMBER .

DECLARE @YEARS TABLE (Y INT) DECLARE @I INT, @NY INT SELECT @I = 2004, @NY = YEAR(GETDATE()) WHILE @I <= @NY BEGIN INSERT @YEARS SELECT @I SET @I = @I + 1 END SELECT Y FROM @YEARS ORDER BY Y DESC


SET NOCOUNT ON DECLARE @max int set @max = DATEPART(year, getdate()) CREATE TABLE #temp (val int) while @max >= 2004 BEGIN insert #temp(val) values(@max) set @max = @max - 1 END SELECT * from #temp


WITH n(n) AS ( SELECT 0 UNION ALL SELECT n+1 FROM n WHERE n < 10 ) SELECT year(DATEADD( YY, -n, GetDate())) FROM n ORDER BY n