sp Para Filtrar Serie

11/09/2008 - 19:15 por Juan Marcial | Informe spam
Buenas a todos -
Tengo una tabla Sample, con solo dos campos:
Time (datetieme) (key)
Value (float)

En línea se generan datos como los que sigue
Time Value
01/01/08 00:00:00 0.0
01/01/08 00:00:10 0.123
01/01/08 00:00:12 1.858
01/01/08 00:00:33 1.260
01/01/08 00:00:38 1.260
01/01/08 00:00:46 1.260
01/01/08 00:00:55 1.260
01/01/08 00:01:02 1.260
01/01/08 00:01:10 1.260
01/01/08 00:01:20 1.260
01/01/08 00:01:33 3.140
01/01/08 00:01:40 3.140
01/01/08 00:01:51 3.140
01/01/08 00:01:59 1.268
...

Bien, quisiera un Store Procedure que generará esta serie:
Time Value
01/01/08 00:00:00 0.0
01/01/08 00:00:10 0.123
01/01/08 00:00:12 1.85
01/01/08 00:00:33 1.26
01/01/08 00:01:20 1.26
01/01/08 00:01:33 3.14
01/01/08 00:01:51 3.14
01/01/08 00:01:59 1.26
...

Es decir, se filtran los repetidos internos

¿Muy complejo?

Gracias por adelantado.
Juan Marcial
Ingeniero de Software

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
11/09/2008 - 21:43 | Informe spam
Juan Marcial,

¿Muy complejo?



Si, sobre todo cuando no se provee un criterio o logica a seguir. La proxima
vez trata de explicar con palabras lo que deseas.

Deja ver si entendi bien. Si existen mas de una fila con el mismo valor,
deseas seleccionar las que tienen el min y max valor en la columna [Time],
correcto?

Tal vez podamos alcanzar lo que deseas, si usamos las funciones de ranking

;with r_set
as
(
select
[Time], [Valor],
row_number(partition by [Valor] order by [Time]) as rn1,
row_number(partition by [Valor] order by [Time] DESC) as rn2
from
tu_tabla
)
select [Time], [Valor]
from r_set
where rn1 = 1 or rn2 = 1;
GO


AMB



"Juan Marcial" wrote:

Buenas a todos -
Tengo una tabla Sample, con solo dos campos:
Time (datetieme) (key)
Value (float)

En línea se generan datos como los que sigue
Time Value
01/01/08 00:00:00 0.0
01/01/08 00:00:10 0.123
01/01/08 00:00:12 1.858
01/01/08 00:00:33 1.260
01/01/08 00:00:38 1.260
01/01/08 00:00:46 1.260
01/01/08 00:00:55 1.260
01/01/08 00:01:02 1.260
01/01/08 00:01:10 1.260
01/01/08 00:01:20 1.260
01/01/08 00:01:33 3.140
01/01/08 00:01:40 3.140
01/01/08 00:01:51 3.140
01/01/08 00:01:59 1.268
...

Bien, quisiera un Store Procedure que generará esta serie:
Time Value
01/01/08 00:00:00 0.0
01/01/08 00:00:10 0.123
01/01/08 00:00:12 1.85
01/01/08 00:00:33 1.26
01/01/08 00:01:20 1.26
01/01/08 00:01:33 3.14
01/01/08 00:01:51 3.14
01/01/08 00:01:59 1.26
...

Es decir, se filtran los repetidos internos

¿Muy complejo?

Gracias por adelantado.
Juan Marcial
Ingeniero de Software
Respuesta Responder a este mensaje
#2 Alejandro Mesa
11/09/2008 - 22:10 | Informe spam
Quizas la interpretacion que yo le he dado al problema no sea correcta. Que
tal si deseas la particion por la columna [Valor], pero solo cuando la fila
esta consecutiva a otra con el con el mismo valor. Por ejemplo, si inserto la
fila:

INSERT INTO t VALUES('02/01/08 00:01:10', 1.260)

entonces la solucion anterior no funciona, poque este valor ya existe pero
esta fila no esta a continuacion de la ultima fila que tiene este valor.

Si los valores de la columna [time] son unicos, entonces podriamos usar:

CREATE TABLE t(
[time] DATETIME NOT NULL UNIQUE CLUSTERED,
valor DECIMAL(5, 3) NOT NULL
)
GO

INSERT INTO t VALUES('01/01/08 00:00:00', 0.0)
INSERT INTO t VALUES('01/01/08 00:00:10', 0.1230)
INSERT INTO t VALUES('01/01/08 00:00:12', 1.858)
INSERT INTO t VALUES('01/01/08 00:00:33', 1.260)
INSERT INTO t VALUES('01/01/08 00:00:38', 1.260)
INSERT INTO t VALUES('01/01/08 00:00:46', 1.260)
INSERT INTO t VALUES('01/01/08 00:00:55', 1.260)
INSERT INTO t VALUES('01/01/08 00:01:02', 1.260)
INSERT INTO t VALUES('01/01/08 00:01:10', 1.260)
INSERT INTO t VALUES('01/01/08 00:01:20', 1.260)
INSERT INTO t VALUES('01/01/08 00:01:33', 3.140)
INSERT INTO t VALUES('01/01/08 00:01:40', 3.140)
INSERT INTO t VALUES('01/01/08 00:01:51', 3.140)
INSERT INTO t VALUES('01/01/08 00:01:59', 1.268)

INSERT INTO t VALUES('02/01/08 00:01:10', 1.260)
GO

;WITH r1
AS
(
SELECT
[time],
[valor],
ISNULL(
(
SELECT
MIN(b.[time])
FROM
t AS b
WHERE
b.[time] = a.[time]
AND b.[valor] <> a.[valor]
), '19000101') AS grp
FROM
[t] AS a
),
r2
AS
(
SELECT [valor], MIN([time]) AS min_time, MAX([time]) AS max_time
FROM r1
GROUP BY [valor], grp
)
SELECT a.[time], a.[valor]
FROM [t] AS a INNER JOIN r2 AS b
ON a.valor = b.valor AND (a.[time] = b.min_time OR a.[time] = b.max_time)
ORDER BY a.[time]
GO

DROP TABLE t
GO


AMB




"Alejandro Mesa" wrote:

Juan Marcial,

> ¿Muy complejo?

Si, sobre todo cuando no se provee un criterio o logica a seguir. La proxima
vez trata de explicar con palabras lo que deseas.

Deja ver si entendi bien. Si existen mas de una fila con el mismo valor,
deseas seleccionar las que tienen el min y max valor en la columna [Time],
correcto?

Tal vez podamos alcanzar lo que deseas, si usamos las funciones de ranking

;with r_set
as
(
select
[Time], [Valor],
row_number(partition by [Valor] order by [Time]) as rn1,
row_number(partition by [Valor] order by [Time] DESC) as rn2
from
tu_tabla
)
select [Time], [Valor]
from r_set
where rn1 = 1 or rn2 = 1;
GO


AMB



"Juan Marcial" wrote:

> Buenas a todos -
> Tengo una tabla Sample, con solo dos campos:
> Time (datetieme) (key)
> Value (float)
>
> En línea se generan datos como los que sigue
> Time Value
> 01/01/08 00:00:00 0.0
> 01/01/08 00:00:10 0.123
> 01/01/08 00:00:12 1.858
> 01/01/08 00:00:33 1.260
> 01/01/08 00:00:38 1.260
> 01/01/08 00:00:46 1.260
> 01/01/08 00:00:55 1.260
> 01/01/08 00:01:02 1.260
> 01/01/08 00:01:10 1.260
> 01/01/08 00:01:20 1.260
> 01/01/08 00:01:33 3.140
> 01/01/08 00:01:40 3.140
> 01/01/08 00:01:51 3.140
> 01/01/08 00:01:59 1.268
> ...
>
> Bien, quisiera un Store Procedure que generará esta serie:
> Time Value
> 01/01/08 00:00:00 0.0
> 01/01/08 00:00:10 0.123
> 01/01/08 00:00:12 1.85
> 01/01/08 00:00:33 1.26
> 01/01/08 00:01:20 1.26
> 01/01/08 00:01:33 3.14
> 01/01/08 00:01:51 3.14
> 01/01/08 00:01:59 1.26
> ...
>
> Es decir, se filtran los repetidos internos
>
> ¿Muy complejo?
>
> Gracias por adelantado.
> Juan Marcial
> Ingeniero de Software
Respuesta Responder a este mensaje
#3 Juan Marcial
12/09/2008 - 05:51 | Informe spam
No!
Mira que si cambias el sort:
ORDER BY a.[time]
por
ORDER BY b.min_time

Quita la restriccion que comentas. Tu solución es correcta.

Nada como leer a un experto... Infinitas gracias.


Juan Marcial
Ingeniero de Software


"Alejandro Mesa" wrote:

Quizas la interpretacion que yo le he dado al problema no sea correcta. Que
tal si deseas la particion por la columna [Valor], pero solo cuando la fila
esta consecutiva a otra con el con el mismo valor. Por ejemplo, si inserto la
fila:

INSERT INTO t VALUES('02/01/08 00:01:10', 1.260)

entonces la solucion anterior no funciona, poque este valor ya existe pero
esta fila no esta a continuacion de la ultima fila que tiene este valor.

Si los valores de la columna [time] son unicos, entonces podriamos usar:

CREATE TABLE t(
[time] DATETIME NOT NULL UNIQUE CLUSTERED,
valor DECIMAL(5, 3) NOT NULL
)
GO

INSERT INTO t VALUES('01/01/08 00:00:00', 0.0)
INSERT INTO t VALUES('01/01/08 00:00:10', 0.1230)
INSERT INTO t VALUES('01/01/08 00:00:12', 1.858)
INSERT INTO t VALUES('01/01/08 00:00:33', 1.260)
INSERT INTO t VALUES('01/01/08 00:00:38', 1.260)
INSERT INTO t VALUES('01/01/08 00:00:46', 1.260)
INSERT INTO t VALUES('01/01/08 00:00:55', 1.260)
INSERT INTO t VALUES('01/01/08 00:01:02', 1.260)
INSERT INTO t VALUES('01/01/08 00:01:10', 1.260)
INSERT INTO t VALUES('01/01/08 00:01:20', 1.260)
INSERT INTO t VALUES('01/01/08 00:01:33', 3.140)
INSERT INTO t VALUES('01/01/08 00:01:40', 3.140)
INSERT INTO t VALUES('01/01/08 00:01:51', 3.140)
INSERT INTO t VALUES('01/01/08 00:01:59', 1.268)

INSERT INTO t VALUES('02/01/08 00:01:10', 1.260)
GO

;WITH r1
AS
(
SELECT
[time],
[valor],
ISNULL(
(
SELECT
MIN(b.[time])
FROM
t AS b
WHERE
b.[time] = a.[time]
AND b.[valor] <> a.[valor]
), '19000101') AS grp
FROM
[t] AS a
),
r2
AS
(
SELECT [valor], MIN([time]) AS min_time, MAX([time]) AS max_time
FROM r1
GROUP BY [valor], grp
)
SELECT a.[time], a.[valor]
FROM [t] AS a INNER JOIN r2 AS b
ON a.valor = b.valor AND (a.[time] = b.min_time OR a.[time] = b.max_time)
ORDER BY a.[time]
GO

DROP TABLE t
GO


AMB




"Alejandro Mesa" wrote:

> Juan Marcial,
>
> > ¿Muy complejo?
>
> Si, sobre todo cuando no se provee un criterio o logica a seguir. La proxima
> vez trata de explicar con palabras lo que deseas.
>
> Deja ver si entendi bien. Si existen mas de una fila con el mismo valor,
> deseas seleccionar las que tienen el min y max valor en la columna [Time],
> correcto?
>
> Tal vez podamos alcanzar lo que deseas, si usamos las funciones de ranking
>
> ;with r_set
> as
> (
> select
> [Time], [Valor],
> row_number(partition by [Valor] order by [Time]) as rn1,
> row_number(partition by [Valor] order by [Time] DESC) as rn2
> from
> tu_tabla
> )
> select [Time], [Valor]
> from r_set
> where rn1 = 1 or rn2 = 1;
> GO
>
>
> AMB
>
>
>
> "Juan Marcial" wrote:
>
> > Buenas a todos -
> > Tengo una tabla Sample, con solo dos campos:
> > Time (datetieme) (key)
> > Value (float)
> >
> > En línea se generan datos como los que sigue
> > Time Value
> > 01/01/08 00:00:00 0.0
> > 01/01/08 00:00:10 0.123
> > 01/01/08 00:00:12 1.858
> > 01/01/08 00:00:33 1.260
> > 01/01/08 00:00:38 1.260
> > 01/01/08 00:00:46 1.260
> > 01/01/08 00:00:55 1.260
> > 01/01/08 00:01:02 1.260
> > 01/01/08 00:01:10 1.260
> > 01/01/08 00:01:20 1.260
> > 01/01/08 00:01:33 3.140
> > 01/01/08 00:01:40 3.140
> > 01/01/08 00:01:51 3.140
> > 01/01/08 00:01:59 1.268
> > ...
> >
> > Bien, quisiera un Store Procedure que generará esta serie:
> > Time Value
> > 01/01/08 00:00:00 0.0
> > 01/01/08 00:00:10 0.123
> > 01/01/08 00:00:12 1.85
> > 01/01/08 00:00:33 1.26
> > 01/01/08 00:01:20 1.26
> > 01/01/08 00:01:33 3.14
> > 01/01/08 00:01:51 3.14
> > 01/01/08 00:01:59 1.26
> > ...
> >
> > Es decir, se filtran los repetidos internos
> >
> > ¿Muy complejo?
> >
> > Gracias por adelantado.
> > Juan Marcial
> > Ingeniero de Software
Respuesta Responder a este mensaje
#4 Alejandro Mesa
12/09/2008 - 14:34 | Informe spam
Juan Marcial,

Experto?

Quiciera yo ser uno de ellos.

Persistente, eso si.

AMB


"Juan Marcial" wrote:

No!
Mira que si cambias el sort:
ORDER BY a.[time]
por
ORDER BY b.min_time

Quita la restriccion que comentas. Tu solución es correcta.

Nada como leer a un experto... Infinitas gracias.


Juan Marcial
Ingeniero de Software


"Alejandro Mesa" wrote:

> Quizas la interpretacion que yo le he dado al problema no sea correcta. Que
> tal si deseas la particion por la columna [Valor], pero solo cuando la fila
> esta consecutiva a otra con el con el mismo valor. Por ejemplo, si inserto la
> fila:
>
> INSERT INTO t VALUES('02/01/08 00:01:10', 1.260)
>
> entonces la solucion anterior no funciona, poque este valor ya existe pero
> esta fila no esta a continuacion de la ultima fila que tiene este valor.
>
> Si los valores de la columna [time] son unicos, entonces podriamos usar:
>
> CREATE TABLE t(
> [time] DATETIME NOT NULL UNIQUE CLUSTERED,
> valor DECIMAL(5, 3) NOT NULL
> )
> GO
>
> INSERT INTO t VALUES('01/01/08 00:00:00', 0.0)
> INSERT INTO t VALUES('01/01/08 00:00:10', 0.1230)
> INSERT INTO t VALUES('01/01/08 00:00:12', 1.858)
> INSERT INTO t VALUES('01/01/08 00:00:33', 1.260)
> INSERT INTO t VALUES('01/01/08 00:00:38', 1.260)
> INSERT INTO t VALUES('01/01/08 00:00:46', 1.260)
> INSERT INTO t VALUES('01/01/08 00:00:55', 1.260)
> INSERT INTO t VALUES('01/01/08 00:01:02', 1.260)
> INSERT INTO t VALUES('01/01/08 00:01:10', 1.260)
> INSERT INTO t VALUES('01/01/08 00:01:20', 1.260)
> INSERT INTO t VALUES('01/01/08 00:01:33', 3.140)
> INSERT INTO t VALUES('01/01/08 00:01:40', 3.140)
> INSERT INTO t VALUES('01/01/08 00:01:51', 3.140)
> INSERT INTO t VALUES('01/01/08 00:01:59', 1.268)
>
> INSERT INTO t VALUES('02/01/08 00:01:10', 1.260)
> GO
>
> ;WITH r1
> AS
> (
> SELECT
> [time],
> [valor],
> ISNULL(
> (
> SELECT
> MIN(b.[time])
> FROM
> t AS b
> WHERE
> b.[time] = a.[time]
> AND b.[valor] <> a.[valor]
> ), '19000101') AS grp
> FROM
> [t] AS a
> ),
> r2
> AS
> (
> SELECT [valor], MIN([time]) AS min_time, MAX([time]) AS max_time
> FROM r1
> GROUP BY [valor], grp
> )
> SELECT a.[time], a.[valor]
> FROM [t] AS a INNER JOIN r2 AS b
> ON a.valor = b.valor AND (a.[time] = b.min_time OR a.[time] = b.max_time)
> ORDER BY a.[time]
> GO
>
> DROP TABLE t
> GO
>
>
> AMB
>
>
>
>
> "Alejandro Mesa" wrote:
>
> > Juan Marcial,
> >
> > > ¿Muy complejo?
> >
> > Si, sobre todo cuando no se provee un criterio o logica a seguir. La proxima
> > vez trata de explicar con palabras lo que deseas.
> >
> > Deja ver si entendi bien. Si existen mas de una fila con el mismo valor,
> > deseas seleccionar las que tienen el min y max valor en la columna [Time],
> > correcto?
> >
> > Tal vez podamos alcanzar lo que deseas, si usamos las funciones de ranking
> >
> > ;with r_set
> > as
> > (
> > select
> > [Time], [Valor],
> > row_number(partition by [Valor] order by [Time]) as rn1,
> > row_number(partition by [Valor] order by [Time] DESC) as rn2
> > from
> > tu_tabla
> > )
> > select [Time], [Valor]
> > from r_set
> > where rn1 = 1 or rn2 = 1;
> > GO
> >
> >
> > AMB
> >
> >
> >
> > "Juan Marcial" wrote:
> >
> > > Buenas a todos -
> > > Tengo una tabla Sample, con solo dos campos:
> > > Time (datetieme) (key)
> > > Value (float)
> > >
> > > En línea se generan datos como los que sigue
> > > Time Value
> > > 01/01/08 00:00:00 0.0
> > > 01/01/08 00:00:10 0.123
> > > 01/01/08 00:00:12 1.858
> > > 01/01/08 00:00:33 1.260
> > > 01/01/08 00:00:38 1.260
> > > 01/01/08 00:00:46 1.260
> > > 01/01/08 00:00:55 1.260
> > > 01/01/08 00:01:02 1.260
> > > 01/01/08 00:01:10 1.260
> > > 01/01/08 00:01:20 1.260
> > > 01/01/08 00:01:33 3.140
> > > 01/01/08 00:01:40 3.140
> > > 01/01/08 00:01:51 3.140
> > > 01/01/08 00:01:59 1.268
> > > ...
> > >
> > > Bien, quisiera un Store Procedure que generará esta serie:
> > > Time Value
> > > 01/01/08 00:00:00 0.0
> > > 01/01/08 00:00:10 0.123
> > > 01/01/08 00:00:12 1.85
> > > 01/01/08 00:00:33 1.26
> > > 01/01/08 00:01:20 1.26
> > > 01/01/08 00:01:33 3.14
> > > 01/01/08 00:01:51 3.14
> > > 01/01/08 00:01:59 1.26
> > > ...
> > >
> > > Es decir, se filtran los repetidos internos
> > >
> > > ¿Muy complejo?
> > >
> > > Gracias por adelantado.
> > > Juan Marcial
> > > Ingeniero de Software
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida