选择底部 n 条记录并连接在同一行

问题描述

我在表中有一个选择 n 条底部记录,并在同一行中返回一个连接值。 这是代码没问题但不返回 n 条底部记录:

SELECT
    STUFF((
        SELECT '; ' + 
            ISNULL(Val1,'') + '; ' +
            ISNULL(Val2,'') + '; ' +
            ISNULL(Val3,'') + '; ' +
            ISNULL(Val4),'')
        FROM Table_x
    FOR XML PATH ('')),1,2,'') AS val;

我写了其他查询返回 n 条底部记录,但我需要将 KEPServerEX 与 ODBC 连接一起使用,并且它仅支持 SELECT 和 EXECUTE:

DECLARE @max_id INT
SELECT @max_id = MAX(id) FROM table_x
SET @max_id = @max_id - 20
SELECT
    STUFF((
        SELECT '; ' + 
            ISNULL(val1,'') + '; ' +
            ISNULL(val2,'') + '; ' +
            ISNULL(val3,'') + '; ' +
            ISNULL(val4,14),'')
        FROM 
        (
            SELECT *
            FROM table_x
            WHERE id > @max_id
        ) AS Latest_rec
    FOR XML PATH ('')),'') AS val;

我需要有一个很长的回报。例如: val1;val2 ; val3; val4;值1; val2; val3; val4.

我使用 Microsoft sql Server 2012 (SP3) - 11.0.6020.0 (X64) Express Edition(64 位)。但问题是 KEPServerEX 只接受 SELECT 和 EXECUTE。

enter image description here

目前,我没有找到其他查询返回 KEPServerEX 支持的同一行底部的 n 条记录。

解决方法

您可以通过使用 row_number() 窗口排名按 id 列的降序排列底部 n 行。我选择了底部 5 行。您可以随意选择。

SELECT
    STUFF((
        SELECT '; ' + 
            ISNULL(Val1,'') + '; ' +
            ISNULL(Val2,'') + '; ' +
            ISNULL(Val3,'') + '; ' +
            ISNULL(Val4,''),'')
        (select *,row_number()over(order by id desc) rn FROM Table_x)t
        where rn=5
    FOR XML PATH ('')),1,2,'') AS val;

如果您使用的是 SQL Server 2017 或更高版本,那么您可以使用 string_agg(),它非常易于使用且速度更快。

SELECT string_agg(ISNULL(Val1,'') + '; ' + ISNULL(Val2,'') + '; ' + ISNULL(Val3,'') + '; ' + ISNULL(Val4,';')
from (select *,row_number()over(order by id desc) rn FROM Table_x)t
where rn=5
    
,

按 ID 排序时选择最后 20 行。以 ASC 顺序返回,带一个查询

SELECT
    STUFF((
        SELECT '; ' + 
            ISNULL(val1,'') + '; ' +
            ISNULL(val2,'') + '; ' +
            ISNULL(val3,'') + '; ' +
            ISNULL(val4,14),'')
        FROM 
        (
            SELECT top(20) *
            FROM table_x
            ORDER BY id DESC
        ) AS Latest_rec
        ORDER BY id ASC
        FOR XML PATH ('')),'') AS val;