У меня есть таблица в SQL Server, как показано ниже:

DECLARE @tbl TABLE (val1 VARCHAR(10), val2 VARCHAR(10) )

INSERT INTO @tbl
VALUES ('x', 'a'), ('x', 'a'), ('p', 'b'), ('y', 'a'), ('p', 'b');

val1  |  val2
------+-------
x     |   a
x     |   a
p     |   b
y     |   a
p     |   b

Результатом должны быть строки a (из val2), только если значение a в val1 изменится на y хотя бы один раз. Но строки val2.b следует игнорировать в результате, так как его значение в val1 не меняется.

val1  |  val2
------+------
x     |   a
x     |   a
y     |   a
2
bill 15 Сен 2016 в 14:41

4 ответа

Лучший ответ

Попробуй это,

select t.*
from @tbl t
INNER JOIN (    select  t2.val2
                from @tbl t2
                group by t2.val2 
                having min(t2.val1) <> max(t2.val1)
            ) AS tt ON tt.val2 = t.val2
2
Jatin Patel 15 Сен 2016 в 11:59

Это делает то, что вы хотите?

select t.*
from @tbl t
where t.val2 = (select t2.val2
                from @tbl t2
                group by t2.val2 
                having min(t2.val1) <> max(t2.val1)
               );
1
Gordon Linoff 16 Сен 2016 в 00:26
SELECT
    *
FROM @tbl
WHERE val2 IN
(
    SELECT
        Z.val2
    FROM
    (
        SELECT
            *,ROW_NUMBER() OVER(Partition BY val2 Order BY Val2) AS PartNo
        FROM     
        (
            SELECT 
                *   
            FROM @tbl 
            GROUP BY val1,val2
        )X
    )Z WHERE Z.PartNo>1
)
1
Sandip - Full Stack Developer 15 Сен 2016 в 12:04

Я наконец-то использую, как показано ниже.

SELECT t.*
FROM @tbl t
WHERE EXISTS (
    SELECT t2.val2
    FROM @tbl t2
    WHERE t.val2 = t2.val2
    GROUP BY t2.val2
    HAVING min(t2.val1) <> max(t2.val1)
    )
2
bill 15 Сен 2016 в 13:04