SQL Server行号按大小写顺序排列
编辑了整个主题 我需要创建一个按类型对文章进行排序的视图 如果我只有类型:*值->我只需要显示这一行。 如果我的类型为:*VALUE&2->仍然根据*值类型显示行。 如果我只有类型:2->显示这个。 我已经有过这样的想法: VALUE*是一个应该来自另一个具有联接的表的值 从项中选择Id项、名称项、类型项、Id项类型项 其中Name_item='Gillette'和Id_Type_item=VALUE*或Id_Type_item='10' 逐案订购SQL Server行号按大小写顺序排列,sql,sql-server,sql-order-by,case,row-number,Sql,Sql Server,Sql Order By,Case,Row Number,编辑了整个主题 我需要创建一个按类型对文章进行排序的视图 如果我只有类型:*值->我只需要显示这一行。 如果我的类型为:*VALUE&2->仍然根据*值类型显示行。 如果我只有类型:2->显示这个。 我已经有过这样的想法: VALUE*是一个应该来自另一个具有联接的表的值 从项中选择Id项、名称项、类型项、Id项类型项 其中Name_item='Gillette'和Id_Type_item=VALUE*或Id_Type_item='10' 逐案订购 我猜,当按Id\u item DESC、Id\
我猜,当按Id\u item DESC、Id\u Type\u item DESC超额订购行数时,您想要的是从每个选择返回的第一行?不需要对同一个表上的每个变量使用单独的SELECT语句,您可以使用窗口函数来实现这一点。我相信这就是你想要的
WITH CTE AS(
--The following assumes table A and B have the same DDL (which begs the question, why are they different tables?)
SELECT *,
ROW_NUMBER() OVER (PARTITION BY var
ORDER BY (SELECT NULL)) AS RN --Replace SELECT(NULL) with your actual ordering criteria
FROM A
WHERE var IN (1,2)
UNION --ALL(?)
SELECT *
ROW_NUMBER() OVER (PARTITION BY var
ORDER BY (SELECT NULL)) AS RN --Replace SELECT(NULL) with your actual ordering criteria
FROM B
WHERE var IN (3))
SELECT *
FROM CTE
WHERE RN = 1;
这里有一个可能的解决办法。在这种情况下,行数、秩和密秩都将起作用。但是,行计数在sql server中不是有效的窗口函数
DECLARE @A TABLE(ID INT, Value INT)
DECLARE @B TABLE(ID INT,Value INT)
INSERT INTO @A VALUES (1,1),(2,1),(3,2),(4,3),(5,2),(6,1),(7,3)
INSERT INTO @B VALUES (1,1),(2,1),(3,1),(4,2),(5,3),(6,2),(7,1),(8,3)
;WITH D AS
(
SELECT ID,Value FROM @A WHERE Value IN(1,2)
UNION ALL
SELECT ID,Value FROM @B WHERE Value IN (3)
)
SELECT * FROM
(
SELECT
ID, Value,
ValueRankInSet = DENSE_RANK() OVER(PARTITION BY VALUE ORDER BY ID) -- <-- If you do not have an ID field you can subst ID with NEWID() as order is not important
FROM D
)AS X
WHERE ValueRankInSet = 1
在您的选择中分配优先级,然后在行编号中按优先级排序:
with cte as
(
SELECT *,
row_number()
over (-- partition by ???
order by prio) as Position
FROM
(
SELECT 1 as prio, * FROM A WHERE var = 1
UNION -- probably a more efficient UNION ALL
SELECT 2 as prio, * FROM A WHERE var = 2
UNION -- probably a more efficient UNION ALL
SELECT 3 as prio, * FROM B WHERE var = 3
)
)
select *
from cte
WHERE Position = 1
使用函数ROW_NUMBER创建从1开始的具有所需顺序的排名。或具有适当顺序的TOP 1。听起来您需要在var字段上使用密集的_秩。编辑问题添加一些示例数据和所需的结果会很有帮助。您希望从第一个Select返回结果的行中选择一行吗?这些选择实际上是在访问不同的表吗?您的查询和解释都没有任何意义。您需要发布示例数据,这是第三个请求。否则,没有人能够理解这一点。我想为优先级为1>2>3的案例之一选择唯一的原始数据。谢谢你的快速回答:编辑:不是每个选择的第一个原始数据,而是我做的每个选择的第一个原始数据。@Rurirm我不明白你的意思。样本数据和预期结果,如约格什所要求的,将非常有用。@Rurirm和什么是原始数据?@Rurirm请发布我们一直要求的样本数据。我说的是样本数据,而不是实际数据。我非常喜欢你的解决方案@d当您要对多行进行分组时,“partition by”子句是否相关?@MJH我不能,因为我还没有声誉xD限制为15 partition by类似于group by foraggregates@Rurirm:那么你需要问一些更好的问题
with cte as
(
SELECT *,
row_number()
over (-- partition by ???
order by prio) as Position
FROM
(
SELECT 1 as prio, * FROM A WHERE var = 1
UNION -- probably a more efficient UNION ALL
SELECT 2 as prio, * FROM A WHERE var = 2
UNION -- probably a more efficient UNION ALL
SELECT 3 as prio, * FROM B WHERE var = 3
)
)
select *
from cte
WHERE Position = 1