Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Extraer primeras filas (https://www.clubdelphi.com/foros/showthread.php?t=94750)

Angel.Matilla 22-06-2020 13:06:43

Extraer primeras filas
 
Buenos días. Tengo que montar un query a partir de estas dos tablas:
Código SQL [-]
CREATE TABLE PROCESO (
  CODPRV VARCHAR(3) CHARACTER SET ISO8859_1 DEFAULT '13' NOT NULL COLLATE ES_ES_CI_AI,
  CODIGO INTEGER DEFAULT 2 NOT NULL,
  NOMBRE VARCHAR(30) CHARACTER SET ISO8859_1 COLLATE ES_ES_CI_AI,
  ELECTOS SMALLINT,
  PRIMARY KEY (CODPRV,CODIGO));

CREATE TABLE ELECCIONES (
  CODPRV VARCHAR(3) CHARACTER SET ISO8859_1 DEFAULT '13' NOT NULL COLLATE ES_ES_CI_AI,
  CODIGO SMALLINT NOT NULL,
  PROCESO INTEGER NOT NULL,
  FECHA SMALLINT NOT NULL,
  CERRADO SMALLINT DEFAULT 1,
  PRIMARY KEY (CODPRV,CODIGO));
El campo CODIGO de la tabla PROCESO es el campo PROCESO en la tabla ELECCIONES y esta tabla tiene, por ejemplo, estos registros:

Bien. Necesito un query que me saque, por ejemplo, los tres primeros de cada uno de los valores del campo proceso de esta tabla; es decir los tres primeros para el valor 3, los tres primeros para el 4, etc.

Hasta ahora lo que hago es recorrer la tabla PROCESO e ir buscando los x valores primeros para cada código en la tabla ELECCIONES. ¿Podría montarse todo en un solo query?

luisgutierrezb 22-06-2020 22:24:02

Si, con un subquery

Angel.Matilla 23-06-2020 10:16:15

Pero ¿cómo? No se me ocurre como montar ese subquery. He probado con esto:
Código SQL [-]
SELECT FIRST 4 Codigo, Proceso
  FROM Elecciones 
 WHERE Proceso IN (SELECT Codigo FROM Proceso WHERE Codigo > 2)
Pero sólo me saca cuatro filas, lógicamente, y no lo que busco que en mi caso serían 16.

Angel.Matilla 23-06-2020 10:23:02

Y los otros subquery que he probado me dan un error: Multiple rows in singleton select.

Casimiro Notevi 23-06-2020 11:19:51

Me parece que tendrás que hacerlo con un "stored procedure".

Angel.Matilla 23-06-2020 18:48:12

Cita:

Empezado por Casimiro Notevi (Mensaje 537758)
Me parece que tendrás que hacerlo con un "stored procedure".

Lo había pensado pero para una única ocasión en todo el proyecto creo que no merece la pena. Gracias.

fjcg02 24-06-2020 21:58:56

Hola

Si tienes tiempo busca informacion de OVER()

Código SQL [-]
SELECT ROW_NUMBER() OVER(ORDER BY workdept, lastname) AS Nbr, <-- se supone que comienza a renumerar las filas
lastname, salary
FROM employee
ORDER BY workdept, lastname

Te podría renumerar los numeros de fila por grupos. Es decir, le dices por qué campo quieres "resetear", tambien puedes sumar, etc y a partir de ahí ves qué puedes hacer.

No puedo ayudarte mucho más porque no he utilizado esta opción apenas, y fue hace mucho tiempo.

Saludos


La franja horaria es GMT +2. Ahora son las 01:19:15.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi