Sql server 如何在一组行中返回多个值。

Sql 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

我曾尝试使用Max()、子查询和联接,但我的知识有限,无法确定如何组织它们。我愿意只使用几个嵌套的select语句,因为我知道它可能会占用大量资源,但我无法让它工作

我需要返回任何空值,以及每个位置的最高配置ID

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