我有一个表,其数据类似于以下内容。
我一直在使用一个大表,其中有许多行,它们的标志和键各不相同。我设法将它们归类,以便在标志为true的地方具有最低的标识,在标志为false的地方具有最低的标识。
╔══════════════════╦══════╦═══════╗
║ Email ║ Flag ║ Key ║
╠══════════════════╬══════╬═══════╣
║ [email protected] ║ 1 ║ 77731 ║
║ [email protected] ║ 0 ║ 67980 ║
║ [email protected] ║ 1 ║ 64417 ║
║ [email protected] ║ 0 ║ 71733 ║
║ [email protected] ║ 1 ║ 95655 ║
║ [email protected] ║ 0 ║ 91016 ║
╚══════════════════╩══════╩═══════╝
现在,对于每个不同的电子邮件,如果存在一个真AND假标志,我想返回真Key值。否则,我想返回最小值。
因此,理想情况下,输出将如下所示:
╔══════════════════╦══════╦═══════╗
║ Email ║ Flag ║ Key ║
╠══════════════════╬══════╬═══════╣
║ [email protected] ║ 1 ║ 77731 ║
║ [email protected] ║ 1 ║ 64417 ║
║ [email protected] ║ 1 ║ 95655 ║
║ [email protected] ║ 0 ║ 91016 ║
╚══════════════════╩══════╩═══════╝
我一直在尝试使用前两个中的case语句进行各种分组,使用子句,但看不到如何进行。
如果确实有帮助,我只需要电子邮件和密钥。
有很多方法,这里有两种。
方法1
您可以像这样的CTE做到这一点:
WITH data_cte AS (
SELECT Email, MAX(CAST(Flag AS INT)) AS Flag
FROM Data
GROUP BY Email)
SELECT Data.*
FROM data_cte
JOIN Data
ON Data.Email = data_cte.Email
AND Data.Flag = data_cte.Flag
要取消构造它的CTE部分刚刚得到的MAX
标志值每封电子邮件(需要CAST
到INT
,因为你不能MAX
在一BIT
列)和查询的其余部分加入CTE回到谈判桌来获得相关数据行。
方法2
使用UNION
:
SELECT *
FROM Data
WHERE Flag = 1
UNION
SELECT *
FROM Data
WHERE Flag = 0
AND NOT EXISTS(SELECT *
FROM Data AS InnerData
WHERE InnerData.Flag = 1
AND InnerData.Email = Data.Email)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句