Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server行号按大小写顺序排列_Sql_Sql Server_Sql Order By_Case_Row Number - Fatal编程技术网

SQL Server行号按大小写顺序排列

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\

编辑了整个主题

我需要创建一个按类型对文章进行排序的视图

如果我只有类型:*值->我只需要显示这一行。 如果我的类型为:*VALUE&2->仍然根据*值类型显示行。 如果我只有类型:2->显示这个。 我已经有过这样的想法:

VALUE*是一个应该来自另一个具有联接的表的值

从项中选择Id项、名称项、类型项、Id项类型项 其中Name_item='Gillette'和Id_Type_item=VALUE*或Id_Type_item='10' 逐案订购
我猜,当按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