Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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 Server_Select_Sql Order By_Union_Union All - Fatal编程技术网

Sql server 选择具有多个并集和按顺序排列的顶部

Sql server 选择具有多个并集和按顺序排列的顶部,sql-server,select,sql-order-by,union,union-all,Sql Server,Select,Sql Order By,Union,Union All,我想从SQL Server中的数据库中选择最新记录。如果只选择了一项,则最终输出如下: SELECT TOP(10) * from dbo.Eventos WHERE Tipo LIKE '%OS%' AND Distrito LIKE '%' +始终在末尾添加: ORDER BY Data DESC 注意:类似“%”的发行版必须保留,因为它有时会通过编程更改为%以外的其他版本 如果选择了更多项,则查询将为每个项以编程方式添加一行UNION。最后,将一如既往地添加订购方。所有4项均已选中的

我想从SQL Server中的数据库中选择最新记录。如果只选择了一项,则最终输出如下:

SELECT TOP(10) * from dbo.Eventos WHERE Tipo LIKE '%OS%' AND Distrito LIKE '%' 
+始终在末尾添加:

ORDER BY Data DESC
注意
类似“%”
的发行版必须保留,因为它有时会通过编程更改为
%
以外的其他版本

如果选择了更多项,则查询将为每个项以编程方式添加一行
UNION
。最后,将一如既往地添加订购方。所有4项均已选中的示例:

SELECT TOP(10) * from dbo.Eventos WHERE Tipo LIKE '%OS%' AND Distrito LIKE '%' 
UNION ALL SELECT TOP(10) * from dbo.Eventos WHERE Tipo LIKE '%Rad%' AND Distrito LIKE '%' 
UNION ALL SELECT TOP(10) * from dbo.Eventos WHERE Tipo LIKE '%Aci%' AND Distrito LIKE '%'
UNION ALL SELECT TOP(10) * from dbo.Eventos WHERE Tipo LIKE '%Out%' AND Distrito LIKE '%' 
ORDER BY Data DESC
但这为每个
WHERE
子句提供了最早的10个结果,这些子句按数据描述
排序


如何获得每个项目(
其中
)的最新X结果?

如果我理解正确,您需要每个tipo的10个最新事件,如os、rad、aci、out。您可以通过查看数据(我假设这是一个日期字段)来确定最近的数据,我们可以通过使用tipo的行数分区来完成这一任务,而不需要所有的联合。但由于我们有tipo的通配符,我们需要将它们定义为同一组;这可以通过window函数中的case语句来完成

我假设在填充时,Distrito对于每个tipo都具有相同的值

WITH CTE AS (
    SELECT E.*, Row_number() over (partition by 
      CASE WHEN Tipo LIKE '%OS%' then 'OS' 
           WHEN Tipo like '%Rad%' then 'Rad'
           WHEN Tipo LIKE '%Aci%' then 'ACI'
           WHEN tipo LIKE '%Out%' then 'OUT' end order by data Desc) RN
    FROM dbo.Eventos E 
    WHERE (Tipo LIKE '%OS%' OR Tipo LIKE '%Rad%' OR Tipo LIKE '%Aci%' OR Tipo LIKE '%Out%') 
      AND Distrito like '%')
SELECT * 
FROM  cte 
WHERE RN <=10;

您需要子查询拥有自己的order by,以便为每个tipo分组获得正确的前10名。要实现这一点,您需要每个查询充当内联视图,并在联合发生之前完全具体化(实际生成数据)

这看起来像是SQL server而不是mySQL。你确定你的标签是正确的吗?你的第一个解决方案在“行号”附近给了我不正确的语法。您的第二个解决方案也不起作用(3
关键字“ORDER”附近的语法不正确
错误,第5、7和9行),但似乎更符合我的需要(不要忘记额外的SELECT(UNION)以编程方式添加。我已更新我的问题以进行澄清。第一个问题在E.*和行号之间缺少逗号。第二个问题需要添加多个选项和一些()在第二个解决方案中重复了很多次,你可以看出为什么我觉得第一个更优雅。第一个解决方案比第二个解决方案更不容易编程实现,而第二个解决方案正是我想要的。
SELECT * FROM (
  SELECT * FROM 
  (SELECT TOP(10) * from dbo.Eventos WHERE Tipo LIKE '%OS%' AND Distrito LIKE '%' ORDER BY DATA desc) A 
  UNION ALL
  SELECT * FROM  
  (SELECT TOP(10) * from dbo.Eventos WHERE Tipo LIKE '%Rad%' AND Distrito LIKE '%' ORDER BY DATA DESC) B
  UNION ALL 
  SELECT * FROM 
  (SELECT TOP(10) * from dbo.Eventos WHERE Tipo LIKE '%Aci%' AND Distrito LIKE '%' ORDER BY DATA DESC) C
  UNION ALL 
  SELECT * FROM 
  (SELECT TOP(10) * from dbo.Eventos WHERE Tipo LIKE '%Out%' AND Distrito LIKE '%' ORDER BY Data DESC) D
) E
ORDER BY DATA DESC;