我曾尝试使用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时,我充满希望,但我认为那是一个死路一条。另外,我不相信自联接会起作用,因为我自己加入的数据都在一列中。
答案 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