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