SELECT 具有多个 UNION 和 ORDER BY 的 TOP

SELECT TOP with multiple UNION and with ORDER BY

我想从 SQL 服务器的数据库中 select 获取最新记录。如果只有 一项 被 select 编辑,最终输出是这样的:

SELECT TOP(10) * from dbo.Eventos WHERE Tipo LIKE '%OS%' AND Distrito LIKE '%' 

+ 总是在末尾添加:

ORDER BY Data DESC

注意Distrito LIKE '%' 必须保留,因为它有时会以编程方式更改为 % 以外的内容。

如果 select 编辑了更多项目,则查询会为每个项目 以编程方式添加 UNION。最后,ORDER BY 一如既往地添加。选中所有 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

但这给了我 OLDEST 10 个结果,每个 WHERE 子句排序 BY Data DESC

如何获得每个项目 (WHERE) 的 NEWEST X 个结果?

如果我没理解错的话,你想要每个 tipo 的 10 most 最近事件os,例如 os、rad、aci、out。您可以通过查看数据来确定最近的 most(我假设这是一个日期字段)我们可以通过使用没有所有联合的 tipo 的 ROW_NUMBER 分区来实现这一点。但是由于我们有 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;

我们使用通用 table 表达式 (CTE),因为我们需要先为行号生成结果,然后才能对其进行限制。由于 row_number 会为每个不同的 tipo 重新启动,我们只需要得到 those <=10 来替换你的顶部。

或者只是在您已经完成的基础上再接再厉...

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;

您需要子查询有自己的排序依据,以便为每个 tipo 分组获得正确的前 10 个。为此,您需要每个查询充当内联视图并在合并发生之前完全实现(实际生成数据)。