Sql server 如何在一组行中返回多个值。
我曾尝试使用Max()、子查询和联接,但我的知识有限,无法确定如何组织它们。我愿意只使用几个嵌套的select语句,因为我知道它可能会占用大量资源,但我无法让它工作 我需要返回任何空值,以及每个位置的最高配置IDSql server 如何在一组行中返回多个值。,sql-server,max,Sql Server,Max,我曾尝试使用Max()、子查询和联接,但我的知识有限,无法确定如何组织它们。我愿意只使用几个嵌套的select语句,因为我知道它可能会占用大量资源,但我无法让它工作 我需要返回任何空值,以及每个位置的最高配置ID TABLE ID Location ConfigID 1 AA NULL 2 AA 2 3 AA 1 4 BB 5 5 BB
TABLE
ID Location ConfigID
1 AA NULL
2 AA 2
3 AA 1
4 BB 5
5 BB 4
6 BB 3
7 CC NULL
8 CC 6
我想看到结果:
ID Location ConfigID
1 AA NULL
2 AA 2
4 BB 5
7 CC NULL
8 CC 6
我试过:
select ID, Location, ConfigID
from Table
where ConfigID is null
or configID = (select ConfigID
from table
where Location in (select distinct Location
from Table
order by ConfigID desc
)
)
SQL server不喜欢这样,因为除非使用Top,否则子查询中不能有order by。现在我再次查看它,我认为ORDERBY甚至不在正确的子查询中。这是我所能接近的。当我看到这一切时,我满怀希望,但我认为这是一条死胡同。另外,我不相信自联接会起作用,因为我将自联接的数据都在一列中。您就快到了。是的,您需要使用
TOP 1
,这有什么问题
试试这个:
SELECT ID, Location, ConfigID
FROM myTable t1
WHERE ConfigID IS NULL
OR ID = (SELECT TOP 1 ID
FROM myTable t2
WHERE t2.Location = t1.Location
ORDER BY ConfigID DESC)
这是一个。您最好对
NULL
s和最高ConfigID
进行单独查询,然后对它们进行UNION
查询,然后对它们进行ORDER BY ID
:
WITH cte
AS
(
SELECT ROW_NUMBER() OVER(PARTITION BY Location ORDER BY Location, ConfigId DESC) AS rn, *
FROM [Table]
WHERE ConfigID IS NOT NULL
UNION ALL
SELECT 1, ID, Location, ConfigID
FROM [Table]
WHERE ConfigID IS NULL
)
SELECT ID, Location, ConfigID FROM cte
WHERE rn = 1
ORDER BY ID
链接到。我将使用一个查询获取
NULL
条目,然后使用第二个查询partitionby
获取每个位置的顶部ConfigID行。最后,执行一个联合ALL
,以获得最终结果集并进行排序。这是小提琴:。查询如下:
SELECT
*
FROM
(
-- This query gets the NULL ConfigID entries.
SELECT
TestTable.ID,
TestTable.[Location],
TestTable.ConfigID
FROM
TestTable
WHERE
TestTable.ConfigID IS NULL
UNION ALL
-- This query utilizes the PARTITION BY to get the max ConfigID for each group.
SELECT
TestTablePartitioned.ID,
TestTablePartitioned.[Location],
TestTablePartitioned.ConfigID
FROM
(
SELECT
ROW_NUMBER() OVER
(
PARTITION BY
[Location] -- The column to group the partition by.
ORDER BY
ConfigID DESC -- The column used to determine partition order.
) AS PartitionIndex,
TestTable.ID,
TestTable.[Location],
TestTable.ConfigID
FROM
TestTable
WHERE
TestTable.ConfigID IS NOT NULL
) AS TestTablePartitioned
WHERE
TestTablePartitioned.PartitionIndex = 1 -- Gets the top entry (max ConfigID) for each location.
) AS TestTableUnion
ORDER BY
TestTableUnion.[Location],
TestTableUnion.ConfigID
@RacilHilan感谢您的反馈。更正了SQL查询。问题是针对SQL Server,而不是MySQL,您的查询将使用MySQL。SQL Server中没有
限制
。我不知道union。一般来说,使用联合或子查询是更好地利用资源?或者,因为它们都运行两个查询,所以本质上是相同的吗?我一定是说服自己出于某种原因不使用Top。这很有效。也许你没有把它放在正确的位置,因为你有两个子查询。您也可以使用union
,正如您在其他答案中看到的那样,但是这个答案是最简单的,可能也是最快的。
SELECT
*
FROM
(
-- This query gets the NULL ConfigID entries.
SELECT
TestTable.ID,
TestTable.[Location],
TestTable.ConfigID
FROM
TestTable
WHERE
TestTable.ConfigID IS NULL
UNION ALL
-- This query utilizes the PARTITION BY to get the max ConfigID for each group.
SELECT
TestTablePartitioned.ID,
TestTablePartitioned.[Location],
TestTablePartitioned.ConfigID
FROM
(
SELECT
ROW_NUMBER() OVER
(
PARTITION BY
[Location] -- The column to group the partition by.
ORDER BY
ConfigID DESC -- The column used to determine partition order.
) AS PartitionIndex,
TestTable.ID,
TestTable.[Location],
TestTable.ConfigID
FROM
TestTable
WHERE
TestTable.ConfigID IS NOT NULL
) AS TestTablePartitioned
WHERE
TestTablePartitioned.PartitionIndex = 1 -- Gets the top entry (max ConfigID) for each location.
) AS TestTableUnion
ORDER BY
TestTableUnion.[Location],
TestTableUnion.ConfigID
SELECT *
FROM Table D WHERE
ConfigID = (SELECT MAX(ConfigID) FROM Table
WHERE Location=D.Location )
Union
Select * From Table
Where ConfigID Is NULL
order by Location
-- ID Location ConfigID
WITH CTE_TMP (ID, LOCATION, CONFIGID)
AS
(
SELECT 1 ID, 'AA' LOCATION, NULL CONFIGID
UNION
SELECT 2, 'AA', 2
UNION
SELECT 3, 'AA', 1
UNION
SELECT 4, 'BB', 5
UNION
SELECT 5, 'BB', 4
UNION
SELECT 6, 'BB', 3
UNION
SELECT 7, 'CC', NULL
UNION
SELECT 8, 'CC', 6
)
SELECT DISTINCT ID, LOCATION, CONFIGID FROM CTE_TMP WHERE CONFIGID IS NULL
UNION
SELECT A.ID, A.LOCATION, B.CONFIGID
FROM CTE_TMP A
JOIN (SELECT LOCATION, MAX(CONFIGID) CONFIGID FROM CTE_TMP
GROUP BY LOCATION) B ON A.LOCATION = B.LOCATION AND A.CONFIGID = B.CONFIGID