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 个。为此,您需要每个查询充当内联视图并在合并发生之前完全实现(实际生成数据)。
我想从 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 个。为此,您需要每个查询充当内联视图并在合并发生之前完全实现(实际生成数据)。