我有一张表:
ID | LABEL | SOME_VALUE
1 a rand_1
2 a NULL
3 b rand_9
4 c rand_3
5 c rand_3
6 c rand_3
7 d NULL
8 d rand_4
如您所见,ID是唯一的,标签不是唯一的(可以是1或更多),some_value也不是唯一的。
我想做的是以下内容:
我想获得一个唯一的LABELS列表,它在数据库中存在多行(最少2行),其中行的SOME_VALUE不是NULL。
所以我会得到:
ID | LABEL | SOME_VALUE
1 a rand_1
2 a NULL
7 d NULL
8 d rand_4
作为回报。
我怎样才能做到这一点?
答案 0 :(得分:2)
HAVING参数限制分组项目:
SELECT
Label
FROM dbo.TableName
WHERE NOT Some_Value IS NULL
GROUP BY Label
HAVING COUNT(*) > 2
答案 1 :(得分:2)
有两个版本。第一个与结果中列出的完全一致,消除了rand_3,因为即使它出现三次,所有值都是相同的(我没有看到相关指定的明确条件)。
必须有一个更好的方法,但正如他们所说我今天无法大脑,我有愚蠢的: - )
select *
from tbl
inner join
(
select label
FROM tbl
GROUP BY Label
HAVING count (distinct some_value)
+ sum(distinct case when some_value is null then 1 else 0 end) > 1
) a
on tbl.label = a.label
第二个也按照要求检索C(对于some_value中的至少一个,some_value不为null)。
select *
from tbl
inner join
(
select label
FROM tbl
GROUP BY Label
HAVING count(*) > 1 and count(some_value) > 0
) a
on tbl.label = a.label
答案 2 :(得分:1)
SELECT t1.*
FROM yourTable t1
JOIN yourTable t2
ON t1.LABEL = t2.LABEL
AND t1.ID < t2.ID
WHERE t1.SOME_VALUE IS NOT NULL
OR t2.SOME_VALUE IS NOT NULL
答案 3 :(得分:1)
这应该有效 -
SELECT test.*
FROM (
SELECT label
FROM test
GROUP BY Label
HAVING COUNT(DISTINCT IFNULL(some_value, '~null~')) > 1
) AS tmp
INNER JOIN test
ON tmp.label = test.label;