如果ID相同,则仅选择一行-SQL Server
我正在尝试学习SQL命令,目前正在使用一个查询,该查询将列出所有状态为如果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
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()功能-它将极大地帮助您。