首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择底部n条记录并在同一行中连接

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

Stack Overflow用户
提问于 2021-06-04 19:20:38
回答 2查看 51关注 0票数 0

我在表中有一个select n个底部记录,并在同一行中返回一个串联值。这是代码是可以的,但不能返回n个底层记录:

代码语言:javascript
复制
SELECT
    STUFF((
        SELECT '; ' + 
            ISNULL(Val1, '') + '; ' +
            ISNULL(Val2, '') + '; ' +
            ISNULL(Val3, '') + '; ' +
            ISNULL(Val4), '')
        FROM Table_x
    FOR XML PATH ('')), 1, 2, '') AS val;

我编写了其他查询返回,n底部记录,但我需要在ODBC配置中使用KEPServerEX,它只支持选择和执行:

代码语言:javascript
复制
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 2012 (SP3) - 11.0.6020.0 (X64)快捷版(64位)。但是问题是KEPServerEX,它只接受SELECT并执行。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-04 19:41:55

按id排序时,选择最后20行。按ASC顺序返回,只需一个查询

代码语言:javascript
复制
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;
票数 1
EN

Stack Overflow用户

发布于 2021-06-04 19:41:48

通过使用按id列降序排列的row_number()窗口,可以有底部n行。我已经选择了最后5行。你可以随意选择。

代码语言:javascript
复制
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;

如果您使用的是Server 2017或更高版本,那么您可以使用string_agg(),这是非常容易使用和更快的。

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67842898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档