Diario de SQL Server

Opciones de vistas, índices, checkpoint

Escrito por qwalgrande 13-06-2010 en General. Comentarios (0)

En esta entrada hago referencia a un hilo del foro en el que un usuario, que se está preparando para certificarse como MCTS, necesitaba aclaración para varios conceptos y traté de explicárselos. En él se explican de una forma sencilla varios conceptos como:

  • with check option
  • with view_metadata
  • include y los índices
  • checkpoint
  • alter index with rebuild
  • fillfactor

http://social.msdn.microsoft.com/Forums/es-ES/sqlserveres/thread/92fa97c8-e99e-4b4f-8ca9-4042a2bb2c6e

 

Calcular la moda y la mediana en una función

Escrito por qwalgrande 07-06-2010 en General. Comentarios (0)

A raíz de un post en el foro, me picó la curiosidad y me propuse preparar unas funciones, sino para resolver, sí al menos para servir de punto de inicio en la resolución de estos cálculos. Y existen algunos ejemplos por ahí, pero son difícilmente trasladables a ejemplos de la vida real. Para que esa traslación sea algo más sencillo, nada mejor que encapsular, en este caso, en funciones de SQL Server.

 

Antes, un poco de teoría, o al menos una de las fuentes en las que me he basado para este post.

 

http://www.vitutor.net/2/11/moda_media.html

 

Y bueno, aquí va el código. La primera es una función de apoyo. Separa una cadena de valores separados por comas y las guarda en una tabla. Práctica: 

 

CREATE function [dbo].[fdu_Desglose_Lista] (@pLista varchar(max))

returns @Detalle table (Lista varchar(max) not null) as

begin

;with csvtbl(ini_carac, fin_carac) as (

 select

    ini_carac = convert(bigint, 1),

    fin_carac = charindex(',',@pLista)

 union all

 select

    ini_carac = fin_carac + 1,

    fin_carac = charindex(',',@pLista, fin_carac + 1)

 from

  csvtbl

 where charindex(',',@pLista, fin_carac + 1) <> 0)

 

 insert @Detalle (Lista)

 select substring(@pLista, ini_carac, fin_carac - ini_carac) as Lista

 from csvtbl option(MAXRECURSION 0)

 

return

 

end;

 

Ahora el cálculo de la moda. Devuelve una tabla: 

 

create function dbo.fdu_Moda (@pLista varchar(max)) returns @Modas table (Moda numeric(12,2) null) as

begin

  insert @Modas

  select top 1 with ties

    Candidatos = cast(Lista as numeric(12,2))

  from dbo.fdu_Desglose_Lista(@pLista)

  group by cast(Lista as numeric(12,2))

  having COUNT(*) > 1 --> Si no hay valores repetidos, no hay mediana

  order by COUNT(*) desc

 

return

end;

 

El cálculo de la mediana:

 

create function dbo.fdu_Mediana (@pLista varchar(max)) returns numeric(12,2) as

begin

  declare @Median numeric(12,2)

  declare @mid int, @odd int, @mid1 int, @mid2 int, @NumRowsint

 

  select @NumRows = COUNT(*), @odd = COUNT(*) % 2, @mid = COUNT(*) / 2

  from dbo.fdu_Desglose_Lista(@pLista)

 

  if @NumRows = 1

    select @odd = 1, @mid = 1

  if @odd = 1

    begin

      select @Median = Lista

      from

        (select

           row_number() over(order by Lista) as ID,

           cast(Lista as Numeric(12,2)) as Lista

         from dbo.fdu_Desglose_Lista(@pLista)) P

      where ID = @mid

    end

  else

    begin

      select @Median = (min(Lista) + MAX(Lista)) / 2.0

      from

       (select

          ROW_NUMBER() over (order by Lista) as ID,

          cast(Lista as Numeric(12,2)) as Lista

        from dbo.fdu_Desglose_Lista(@pLista)) P

      where ID = @mid or ID = @mid + 1

    end

 

  return @Median

 

end

 

Por último, un ejemplo de llamada: 

 

declare @Lista varchar(100)

select @Lista = '1,1,2,3,4,5,6,6,7,8,9,'

select * from dbo.fdu_Moda(@Lista)

select dbo.fdu_Mediana(@Lista)