Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Limitar registros con un campo en común a uno sólo

Estas en el tema de Limitar registros con un campo en común a uno sólo en el foro de Bases de Datos General en Foros del Web. Bueno, pues sigo de nuevo con mi proyecto que ya pensé que tenía resuelto, pero al final me falla una pieza (espero que la última) ...
  #1 (permalink)  
Antiguo 03/08/2015, 12:54
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Limitar registros con un campo en común a uno sólo

Bueno, pues sigo de nuevo con mi proyecto que ya pensé que tenía resuelto, pero al final me falla una pieza (espero que la última)

Parto de esta tabla:

Código SQL:
Ver original
  1. propietario   | parcela_cdad | sup_cdad | parcela_cat | sup_cat | cultivo
  2. _______________________________________________________________________
  3. Fulano        |  parcela1    |   250    |Parcela_cat_1| 50      |cultivo1      
  4. Fulano        |  parcela1    |   250    |Parcela_cat_2| 120     |cultivo2    
  5. Fulano        |  parcela1    |   250    |Parcela_cat_3| 80      |cultivo3    
  6. Fulano        |  parcela1    |   250    |Parcela_cat_4| 100     |cultivo4    
  7. Mengano       |  parcela2    |   100    |Parcela_cat_5| 50      |cultivo1  
  8. Mengano       |  parcela2    |   100    |Parcela_cat_6| 50      |cultivo2

A partir de esta tabla quiero obtener otra que sólo me muestre la mayor sup_cat de las que componen una sola parcela_cdad, y que en caso de que las superficies sean iguales, como en el caso de la Parcela_cat_5 y Parcela_cat_6, ambas pertenecientes a parcela2, de forma arbitraria me coja la primera.

Y esto es lo que he hecho:

1.- Añado una columna con la mayor superficie catastral perteneciente a cada parcela_cdad:

Esta es la consulta (PostgreSQL):
Código SQL:
Ver original
  1. CREATE VIEW cult AS
  2. SELECT propietario,
  3.     parcela_cdad,
  4.     sup_cdad,
  5.     parcela_cat,
  6.     sup_cat,
  7.     MAX(sup_cat) OVER (PARTITION BY parcela_cdad) AS mayor_sup_cat,
  8.     cultivo
  9.    FROM parcelas;

Y esta es la Vista:

Código SQL:
Ver original
  1. propietario   | parcela_cdad | sup_cdad | parcela_cat | sup_cat |mayor_sup_cat | cultivo
  2. ______________________________________________________________________________________
  3. Fulano        |  parcela1    |   250    |Parcela_cat_1| 50      | 120          |cultivo1  
  4. Fulano        |  parcela1    |   250    |Parcela_cat_2| 120     | 120          |cultivo2  
  5. Fulano        |  parcela1    |   250    |Parcela_cat_3| 80      | 120          |cultivo3  
  6. Fulano        |  parcela1    |   250    |Parcela_cat_4| 100     | 120          |cultivo4  
  7. Mengano       |  parcela2    |   100    |Parcela_cat_5| 50      | 50           |cultivo1  
  8. Mengano       |  parcela2    |   100    |Parcela_cat_6| 50      | 50           |cultivo2

Ahora selecciono los registros cuya sup_cat sea igual a la mayor:

Código SQL:
Ver original
  1. SELECT * FROM cult
  2. WHERE sup_cat=mayor_sup_cat;

Y esta es la salida:

Código SQL:
Ver original
  1. propietario   | parcela_cdad | sup_cdad | parcela_cat | sup_cat |mayor_sup_cat | cultivo
  2. ______________________________________________________________________________________
  3. Fulano        |  parcela1    |   250    |Parcela_cat_2| 120     | 120          |cultivo1  
  4. Mengano       |  parcela2    |   100    |Parcela_cat_5| 50      | 50           |cultivo1  
  5. Mengano       |  parcela2    |   100    |Parcela_cat_6| 50      | 50           |cultivo2

Este caso se me da pocas veces, pero como existe, pues hay que saber tratarlo.

Se interpreta como que la parcela2 esta compuesta por dos parcelas catastrales, del mismo tamaño y diferentes cultivos. Este es el caso en el que he de seleccionar una de forma arbitraria, y, en definitiva, la pregunta es:

¿Cómo seleccionar el primero de los dos registros cuya columna parcela_cdad es igual a parcela2?

Y opcionalmente....este camino que intento seguir es el correcto o hay formas más lógicas o rápidas de conseguirlo?
__________________
Mi calculadora en Qt
  #2 (permalink)  
Antiguo 03/08/2015, 12:57
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Limitar registros con un campo en común a uno sólo

Código SQL:
Ver original
  1. SELECT * FROM tabla AS t1
  2. LEFT JOIN (SELECT MAX(campo) campo_referencia1, campo_referencia2 FROM tabla GROUP BY campo_referencia) AS t2 ON (t1.campo_referencia1=t2.campo_referencia1 AND t1.campo_referencia2=t2.campo_referencia2)

Campos referencia son los campos en comun en ambas tablas :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 03/08/2015, 15:14
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Respuesta: Limitar registros con un campo en común a uno sólo

Hola Libras:

Gracias por responder. Aún a riesgo de quedar en evidencia de que no me estoy enterando de nada te pregunto....en principio parto de una sola tabla, pero me muestras una composición externa. ¿?
__________________
Mi calculadora en Qt
  #4 (permalink)  
Antiguo 03/08/2015, 15:23
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Limitar registros con un campo en común a uno sólo

Lo que pasa es que estoy haciendo un subquery usando la misma tabla, revisa bien el query para que veas que es lo que se hace, donde no entiendas pregunta :)

una explicacion mas sencilla aqui:

http://www.forosdelweb.com/f86/resul...iente-1134091/
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Última edición por Libras; 03/08/2015 a las 15:51
  #5 (permalink)  
Antiguo 03/08/2015, 20:44
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Respuesta: Limitar registros con un campo en común a uno sólo

Bueno, consulta entendida por fin (son las 4:35 en España, pero es que si no lo consigo no me duermo)

Muchas gracias Libras por mostrarme la forma, y con la explicación, sobre todo a entenderla.

Pero lo cierto es que estoy donde estaba.
Esta ha sido mi consulta:
Código SQL:
Ver original
  1. SELECT t1.propietario,t1.parcela_cdad, t1.parcela_cat, t1.sup_cat FROM parcelas AS t1
  2. RIGHT JOIN (SELECT propietario, MAX(sup_cat) AS suma FROM parcelas GROUP BY propietario, parcela_cdad) AS t2
  3. ON (t1.sup_cat=t2.suma AND t1.propietario=t2.propietario);

Pero la salida es la misma que yo tenía:

Código SQL:
Ver original
  1. propietario   | parcela_cdad | sup_cdad | parcela_cat | sup_cat |mayor_sup_cat | cultivo
  2. ______________________________________________________________________________________
  3. Fulano        |  parcela1    |   250    |Parcela_cat_2| 120     | 120          |cultivo1  
  4. Mengano       |  parcela2    |   100    |Parcela_cat_5| 50      | 50           |cultivo1  
  5. Mengano       |  parcela2    |   100    |Parcela_cat_6| 50      | 50           |cultivo2

Y claro, de ahí me sobra la tercera tupla. El problema se me da cuando hay dos valores sup_cat iguales.
__________________
Mi calculadora en Qt
  #6 (permalink)  
Antiguo 04/08/2015, 12:43
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Limitar registros con un campo en común a uno sólo

sigues sin entender el concepto, con el max deberias de obtener un registro unico, y lo que estas obteniendo puede no ser un registro unico, veo que tienes el campo parcela_cat, ese lo podrias usar en el max


Código SQL:
Ver original
  1. SELECT t1.propietario,t1.parcela_cdad, t1.parcela_cat, t1.sup_cat FROM parcelas AS t1
  2. RIGHT JOIN (SELECT propietario, MAX(sup_cat) AS suma, parcela_cat FROM parcelas GROUP BY propietario, parcela_cdad, parcela_cat) AS t2
  3. ON (t1.sup_cat=t2.suma AND t1.propietario=t2.propietario AND t1.parcela_cat=t2.parcela_cat);
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Etiquetas: campo, limitar, registros, select, sql, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:05.