sql - traer - cómo seleccionar filas basadas en valores distintos de A solo COLUMNA
sql transponer columnas a filas (5)
Necesito consultar una tabla para devolver las filas, pero no puedo consultar la tabla correctamente. Aquí está mi vista de tabla:
Id MailId EmailAddress Name
1 1 [email protected] Mr. A
2 1 [email protected] Mr. B
3 1 [email protected] Mr. C
4 1 [email protected] Mr. D
5 1 [email protected] Mr. A
6 2 [email protected] Mr. E
7 2 [email protected] Mr. A
8 3 [email protected] Mr. F
9 4 [email protected] Mr. D
10 5 [email protected] Mr. F
11 6 [email protected] Mr. D
El conjunto de resultados debe regresar:
Id MailId EmailAddress Name
1 1 [email protected] Mr. A
2 1 [email protected] Mr. B
3 1 [email protected] Mr. C
4 1 [email protected] Mr. D
6 2 [email protected] Mr. E
8 3 [email protected] Mr. F
En otras palabras: primero, deseo seleccionar distintas direcciones de correo electrónico y luego devolver las filas que contienen distintas direcciones de correo electrónico.
Nota: Solo usar la palabra clave "Distinct" no funcionará aquí, ya que seleccionará distintas filas. Mi requisito es seleccionar distintas direcciones de correo electrónico y luego seleccionar las filas que contienen esas direcciones.
Editar: No puedo usar la palabra clave "Agrupar por" tampoco, porque para esto también tendré que agruparme con Id (que es el PK) y al hacerlo devolveré dos filas con los mismos valores de EmailAddress pero con diferentes Id.
En cuanto a su resultado, quizás la siguiente consulta pueda funcionar, pruébelo:
SELECT * FROM tablename
WHERE id IN
(SELECT MIN(id) FROM tablename GROUP BY EmailAddress)
Esto seleccionará solo una fila para cada dirección de correo electrónico distinta, la fila con la id
mínima que es lo que su resultado parece retratar
Intente esto: necesita un CTE (Common Table Expression) que divida (agrupe) sus datos por una dirección de correo electrónico distinta y clasifique cada grupo por ID, el más pequeño primero. Luego, simplemente selecciona la primera entrada para cada grupo, eso debería darte lo que estás buscando:
;WITH DistinctMails AS
(
SELECT ID, MailID, EMailAddress, NAME,
ROW_NUMBER() OVER(PARTITION BY EMailAddress ORDER BY ID) AS ''RowNum''
FROM dbo.YourMailTable
)
SELECT *
FROM DistinctMails
WHERE RowNum = 1
Esto funciona en SQL Server 2005 y posteriores (no mencionó qué versión está usando ...)
si no quieres usar DISTINCT use GROUP BY
SELECT * FROM myTABLE GROUP BY EmailAddress
use esto (suponga que su nombre de tabla son correos electrónicos):
select * from emails as a
inner join
(select EmailAddress, min(Id) as id from emails
group by EmailAddress ) as b
on a.EmailAddress = b.EmailAddress
and a.Id = b.id
espero que esto ayude..
No estoy seguro acerca de su DBMS. Entonces, creé una tabla temporal en Redshift y, desde mi experiencia, creo que esta consulta debería devolver lo que estás buscando:
select min(Id), distinct MailId, EmailAddress, Name
from yourTableName
group by MailId, EmailAddress, Name
Veo que estoy usando una GROUP BY clause
pero aún no tendrá dos filas en contra de ningún MailId
particular.