如果ID相同,则仅选择一行-SQL Server

如果ID相同,则仅选择一行-SQL Server,sql,sql-server,Sql,Sql Server,我正在尝试学习SQL命令,目前正在使用一个查询,该查询将列出所有状态为active(ID=1)和active-busy(ID=2)的客户 问题是有些客户的ID相同,但类型不同。因此,我有一个客户,其ID为1,类型为3,但同一客户也有ID为1,但类型为1,所以我尝试只选择该客户,该客户具有类型1,但也具有相同的ID。因此,如果ID相同,类型为1和3,则仅选择类型3 SELECT CASE WHEN corel.opts LIKE 3 THEN (SEL

我正在尝试学习SQL命令,目前正在使用一个查询,该查询将列出所有状态为
active(ID=1)
active-busy(ID=2)
的客户

问题是有些客户的ID相同,但类型不同。因此,我有一个客户,其ID为1,类型为3,但同一客户也有ID为1,但类型为1,所以我尝试只选择该客户,该客户具有类型1,但也具有相同的ID。因此,如果ID相同,类型为1和3,则仅选择类型3

SELECT 
    CASE 
       WHEN corel.opts LIKE 3
          THEN (SELECT corel.opts
                WHERE corel.objid = rel.id
                  AND corel.type IN (1, 2)
                  AND corel.opts = 3 
          ELSE corel.opts 1 
    END)
这不是一个完整的查询,因为它有许多其他的问题,我不能发布,但若你们能告诉我如何才能做到这一点,我将不胜感激。我只是不知道如何判断表中的ID是否相同但类型不同-只选择类型3。每个客户都有不同的ID,但可以有相同的类型

像这样使用Row_number()

DECLARE @T TABLE
(
    Id INT,
    TypeNo INT
)

INSERT INTO @T
VALUES(1,1),(1,3),(2,1),(2,3),(3,1),(4,3)

;WITH CTE
AS
(
    SELECT
        RN = ROW_NUMBER() OVER(PARTITION BY Id ORDER BY TypeNo DESC),
        Id,
        TypeNo
        FROM @T
)
SELECT
    Id,
    TypeNo
    FROM CTE
        WHERE RN = 1
我的意见

输出


据我所知,您需要的是:

SELECT c1.* 
FROM corel c1
LEFT OUTER JOIN corel c2 ON c1.objid=c2.objid AND c1.type <> c2.type
WHERE (c1.type=1 AND c2.type IS NULL) OR (c1.type=3 AND c2.type=1)
选择c1.*
来自corel c1
c1上的左外连接芯c2。objid=c2.objid和c1.type c2.type
其中(c1.type=1,c2.type为空)或(c1.type=3,c2.type=1)

测试场景是从Jayasurya Satheesh借来的,thx,投票支持

DECLARE @T TABLE
(
    Id INT,
    TypeNo INT
)

INSERT INTO @T
VALUES(1,1),(1,3),(2,1),(2,3),(3,1),(4,3)
--查询将使用
ROW\u NUMBER
PARTITION BY
分别为每个
T.Id
开始行计数。 --
选择带领带的前1行
将占据所有第一行,而不仅仅是第一行:

SELECT TOP 1 WITH TIES
    Id,
    TypeNo
FROM @T AS T
ORDER BY ROW_NUMBER() OVER(PARTITION BY T.Id ORDER BY T.TypeNo DESC)
如果您的
Type=3
不是最高的类型代码,那么简单的
按T.TypeNo DESC排序将是不够的,但是您可以很容易地使用
案例来解决这个问题。

看看ROW_NUMBER()功能-它将极大地帮助您。