Select 后 n 条记录并连接在同一行

Select bottom n records and concatenate in same row

我在 table 中有一个 select n 个底部记录,并且 return 在同一行中有一个连接值。 这是代码可以,但不是 return n 底部记录:

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

我写了其他查询 return n bottom recods 但我需要将 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 ('')), 1, 2, '') AS val;

我需要长话短说了return。例如:val1;val2;值3;值4; val1;值2;值3; val4.

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

目前,我找不到其他查询 return KEPServerEX 支持的同一行中的 n 个底部记录。

您可以使用 row_number() window 按 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
    

Select 按 ID 排序时的最后 20 行。 Return 按 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 ('')), 1, 2, '') AS val;