use*_*463 6 sql-server t-sql sql-server-2008-r2 group-by gaps-and-islands
我有一个包含以下示例数据的队列表:
id company location
1 acme new york
2 acme philadelphia
3 genco st.louis
4 genco san diego
5 genco san francisco
6 acme miami
Run Code Online (Sandbox Code Playgroud)
我想查询每个公司组的队列位置以显示每个公司的排队位置(假设 acme 在 500 Genco 开始之前有 1,000 行,然后在 Genco 记录过程之后 acme 有 5,000 行)。我想要的结果如下所示:
queuePositionId company
1 acme
3 genco
6 acme
Run Code Online (Sandbox Code Playgroud)
我玩过排名和分组,但事实上一个公司组可以在队列中的任何地方多次出现,这一直在扰乱我的聚合。我也尝试过,dense_rank
但无法弄清楚顺序。有任何想法吗?
这是一个差距与岛屿问题。有关此类问题的更多详细信息,请参阅此处。
这应该可以满足您的需要:
-- Generate test data
DECLARE @Companies TABLE
(
ID INT
,Company NVARCHAR(100)
,Location NVARCHAR(100)
);
INSERT @Companies
SELECT *
FROM (VALUES (1, 'acme', 'new york')
,(2, 'acme', 'philadelphia')
,(3, 'genco', 'st.louis')
,(4, 'genco', 'san diego')
,(5, 'genco', 'san francisco')
,(6, 'acme', 'miami')
) AS CompanyLocations(ID, Company, Location);
-- Find company positions
;WITH cte_Companies
AS
(
SELECT ID
,Company
,CASE
WHEN LAG(Company) OVER(ORDER BY ID) = Company
THEN 1
ELSE 0
END AS CompanyPosition
FROM @Companies
)
SELECT ID, Company
FROM cte_Companies
WHERE CompanyPosition = 0
Run Code Online (Sandbox Code Playgroud)
更新 Andriy 指出我的解决方案是 SQL Servre 2012+ 解决方案。以下代码应该适用于 2005 以下的版本。
-- Generate test data
DECLARE @Companies TABLE
(
ID INT
,Company NVARCHAR(100)
,Location NVARCHAR(100)
);
INSERT @Companies
SELECT *
FROM (VALUES (1, 'acme', 'new york')
,(2, 'acme', 'philadelphia')
,(3, 'genco', 'st.louis')
,(4, 'genco', 'san diego')
,(5, 'genco', 'san francisco')
,(6, 'acme', 'miami')
-- Further test data
,(7, 'genco', 'London')
,(8, 'genco', 'Portsmouth')
) AS CompanyLocations(ID, Company, Location);
-- Find company positions
SELECT ID, Company
FROM @Companies c1
WHERE NOT EXISTS (
SELECT *
FROM @Companies c2
WHERE c1.Company = c2.Company
AND c1.ID - 1 = c2.ID
)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
516 次 |
最近记录: |