0

我在表中有一个选择 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 ('')), 1, 2, '') AS val;

我需要长话短说。例如:val1;val2;val3; val4; val1; val2; val3; val4。

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

在此处输入图像描述

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

4

2 回答 2

1

您可以使用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
    
于 2021-06-04T19:41:48.323 回答
1

按 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 ('')), 1, 2, '') AS val;
于 2021-06-04T19:41:55.263 回答