una todas seleccionar ocultar las funciones excluir excepto ejemplos consultas consulta columnas columna campo agrupamiento agrupadas sql sql-server-2008 tsql greatest-n-per-group

todas - Seleccione una columna en SQL no en Group By



seleccionar todas las columnas sql (5)

La respuesta directa es que no puedes. Debe seleccionar un agregado o algo por lo que está agrupando.

Entonces, necesitas un enfoque alternativo.

1). Tome la consulta actual y vuelva a unir los datos base

SELECT cpe.* FROM Filteredfmgcms_claimpaymentestimate cpe INNER JOIN (yourQuery) AS lookup ON lookup.MaxData = cpe.createdOn AND lookup.fmgcms_cpeclaimid = cpe.fmgcms_cpeclaimid

2). Use un CTE para hacerlo todo de una vez ...

WITH sequenced_data AS ( SELECT *, ROW_NUMBER() OVER (PARITION BY fmgcms_cpeclaimid ORDER BY CreatedOn DESC) AS sequence_id FROM Filteredfmgcms_claimpaymentestimate WHERE createdon < ''reportstartdate'' ) SELECT * FROM sequenced_data WHERE sequence_id = 1

NOTA: Usar ROW_NUMBER() asegurará solo un registro por fmgcms_cpeclaimid . Incluso si los registros múltiples están vinculados con el mismo valor createdon . Si puede tener vínculos y desea todos los registros con el mismo valor createdon , use RANK() lugar.

He estado tratando de encontrar información sobre cómo seleccionar una columna no agregada que no está contenida en la declaración Agrupar por en SQL, pero nada de lo que he encontrado hasta ahora parece responder a mi pregunta. Tengo una tabla con tres columnas que quiero de ella. Una es una fecha de creación, una es una identificación que agrupa los registros por una ID de reclamación en particular, y la final es la PK. Quiero encontrar el registro que tiene la fecha de creación máxima en cada grupo de ID de reclamo. Estoy seleccionando el MAX (fecha de creación) y el ID de reclamo (cpe.fmgcms_cpeclaimid) y agrupando por el ID de reclamo. Pero necesito el PK de estos registros (cpe.fmgcms_claimid), y si intento agregarlo a mi cláusula de selección, aparece un error. Y no puedo agregarlo a mi grupo por cláusula porque arrojará mi agrupación prevista. ¿Alguien sabe alguna solución para esto? Aquí hay una muestra de mi código:

Select MAX(cpe.createdon) As MaxDate, cpe.fmgcms_cpeclaimid from Filteredfmgcms_claimpaymentestimate cpe where cpe.createdon < ''reportstartdate'' group by cpe.fmgcms_cpeclaimid

Este es el resultado que me gustaría obtener:

Select MAX(cpe.createdon) As MaxDate, cpe.fmgcms_cpeclaimid, cpe.fmgcms_claimid from Filteredfmgcms_claimpaymentestimate cpe where cpe.createdon < ''reportstartdate'' group by cpe.fmgcms_cpeclaimid


Las columnas en el conjunto de resultados de una consulta de select con una cláusula group by deben ser:

  • una expresión utilizada como uno del group by criterio, o ...
  • una función agregada, o ...
  • un valor literal

Por lo tanto, no puede hacer lo que desea hacer en una única consulta simple. Lo primero que debe hacer es expresar su declaración de problema de una manera clara, algo como:

Deseo encontrar la fila de reclamo individual que tenga la fecha de creación más reciente dentro de cada grupo en mi tabla de reclamaciones

Dado

create table dbo.some_claims_table ( claim_id int not null , group_id int not null , date_created datetime not null , constraint some_table_PK primary key ( claim_id ) , constraint some_table_AK01 unique ( group_id , claim_id ) , constraint some_Table_AK02 unique ( group_id , date_created ) , )

Lo primero que debe hacer es identificar la fecha de creación más reciente para cada grupo:

select group_id , date_created = max( date_created ) from dbo.claims_table group by group_id

Esto le da los criterios de selección que necesita (1 fila por grupo, con 2 columnas: group_id y la fecha de highwater creada) para completar la primera parte del requisito (seleccionando la fila individual de cada grupo. Debe ser una tabla virtual en su consulta de select final:

select * from dbo.claims_table t join ( select group_id , date_created = max( date_created ) from dbo.claims_table group by group_id ) x on x.group_id = t.group_id and x.date_created = t.date_created

Si la tabla no es única por date_created dentro de group_id (AK02), puede obtener filas duplicadas para un grupo determinado.


Lo que está preguntando, señor, es la respuesta de RedFilter. Esta respuesta también ayuda a entender por qué group by es de alguna manera una versión o partición más simple: SQL Server: diferencia entre PARTITION BY y GROUP BY, ya que cambia la forma en que se calcula el valor devuelto y por lo tanto (de alguna manera) puede devolver columnas group by no puede regresar


Puede join la mesa en sí mismo para obtener el PK:

Select cpe1.PK, cpe2.MaxDate, cpe1.fmgcms_cpeclaimid from Filteredfmgcms_claimpaymentestimate cpe1 INNER JOIN ( select MAX(createdon) As MaxDate, fmgcms_cpeclaimid from Filteredfmgcms_claimpaymentestimate group by fmgcms_cpeclaimid ) cpe2 on cpe1.fmgcms_cpeclaimid = cpe2.fmgcms_cpeclaimid and cpe1.createdon = cpe2.MaxDate where cpe1.createdon < ''reportstartdate''


Puedes hacer esto con PARTITION y RANK :

select * from ( select MyPK, fmgcms_cpeclaimid, createdon, Rank() over (Partition BY fmgcms_cpeclaimid order by createdon DESC) as Rank from Filteredfmgcms_claimpaymentestimate where createdon < ''reportstartdate'' ) tmp where Rank = 1