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;
我在 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;