Ver Mensaje Individual
  #1 (permalink)  
Antiguo 03/08/2015, 12:54
dehm
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 2 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