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

时间:2017-07-07 22:44:21

标签: sql-server max

我曾尝试使用Max(),子查询和连接,但我的知识有限,我不知道如何组织它们。我愿意使用几个嵌套的select语句,知道它可能是资源密集型的,但我无法让它工作。

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

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服务器不喜欢这样,因为除非使用Top,否则我不能在子查询中获得订单。现在我再次查看它,我不认为顺序是在正确的子查询中。它尽可能接近我。当我看到Select Max from each subset时,我充满希望,但我认为那是一个死路一条。另外,我不相信自联接会起作用,因为我自己加入的数据都在一列中。

6 个答案:

答案 0 :(得分:1)

你几乎就在那里。是的,您需要使用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)

这是fiddle

答案 1 :(得分:1)

您最好对NULL和最高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

链接到SQL Fiddle

答案 2 :(得分:1)

我会使用一个查询来获取NULL条目,然后使用PARTITION BY进行第二次查询以获取每个位置的顶部ConfigID行。最后执行UNION ALL以获取最终结果集并进行排序。这是小提琴:http://sqlfiddle.com/#!6/dab30/2/0。查询如下:

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

-- 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

答案 5 :(得分:-1)

SELECT DISTINCT ID, Location, ConfigID
FROM Table
WHERE ConfigID IS NULL 
      OR ID = (SELECT ID FROM Table AS t2 
                       WHERE t2.Location = Table.Location
                                          ORDER BY ConfigID DESC LIMIT 1) 
ORDER BY Location