比较 table 的分区并在 TSQL 中为唯一分区创建索引(如果可能的话)
Comparing partitions of a table and creating index for unique partition in TSQL (if it's possible)
我有一个简单的任务要做。虽然可能无法使用 TSQL.
我想根据元素的顺序比较 SQL table 的分区(例如巴士路线的停靠顺序)。这是我的 table:
ID BusNr Seq StopName Date
1 789 1 A 2015-04-08
2 789 2 B 2015-04-08
3 789 3 C 2015-04-08
4 789 4 D 2015-04-08
5 789 1 A 2015-04-16
6 789 2 B 2015-04-16
7 789 3 D 2015-04-16
8 789 1 A 2015-05-10
9 789 2 B 2015-05-10
10 789 3 C 2015-05-10
11 789 4 D 2015-05-10
12 789 5 E 2015-05-10
示例显示了一条公交线路,它在三个不同的日期采用不同的路线。路线由停止序列给出。我需要的是找到一种方法来引用路线的停靠顺序,并为每条公交线路找到唯一的停靠顺序。然后我想创建一个 table 的唯一停止序列(每个都有索引),我可以连接到上面的 table。
是否可以根据此类序列的标识执行连接?
请给我任何建议来解决我的问题。我想知道我是否可以使用 window 功能,但目前我没有找到解决方案。
[评论太少]
我很想帮忙,但我不清楚你的 objective。
我明白了:
路线是唯一的停靠点列表。
不同的日子有不同的路线。
我想要每条公交线路的不同路线。
Maybe you want this:
1. 789 ABC,
2. 789 ABD,
3. 789 ABCDE
加入时,您需要另一条信息来使其独一无二,因为 BusLine 上存在 3 个可能的匹配项,以便与日期联系起来……您可以计算出第 1 周、第 2cnd 周……做你同意吗?
如果是这样,您需要决定是要在每条路线中使用 1 行,还是将其拆分为:
PK INT, BusNr INT, RouteStopSeq INT, RouteStopName CHAR, RouteWeekNumber INT
1, 789, 1, A, 1
2, 789, 2, B, 1
3, 789, 3, C, 1
4, 789, 1, A, 2
5, 789, 2, B, 2
6, 789, 3, D, 2
...
SO...每天都有不同的路线使得 table 您想要创建的数据与您提供的数据相同...很难从如此小的集合中看出整体模式。
CREATE TABLE TempDB.dbo.Data
(
ID INT,
BusNr INT,
Seq INT,
StopName CHAR(1),
Date DATETIME
)
INSERT INTO TempDB.dbo.Data VALUES
( 1,789,1,'A','2015-04-08'),
( 2,789,2,'B','2015-04-08'),
( 3,789,3,'C','2015-04-08'),
( 4,789,4,'D','2015-04-08'),
( 5,789,1,'A','2015-04-16'),
( 6,789,2,'B','2015-04-16'),
( 7,789,3,'D','2015-04-16'),
( 8,789,1,'A','2015-05-10'),
( 9,789,2,'B','2015-05-10'),
(10,789,3,'C','2015-05-10'),
(11,789,4,'D','2015-05-10'),
(12,789,5,'E','2015-05-10')
CREATE FUNCTION fnConcatenateStopNames (@BusNr INT, @Date DATETIME)
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @RouteStopList VARCHAR(MAX) = ''
SELECT @RouteStopList = @RouteStopList + ',' + CONVERT(VARCHAR(10),StopName)
FROM TempDB.dbo.Data D
WHERE D.BusNr = @BusNr
AND D.Date = @Date
ORDER BY Seq
RETURN STUFF(@RouteStopList,1,1,'')
END
SELECT BusNr, Stops, ROW_NUMBER() OVER (ORDER BY BusNr, Stops) BusRouteNumber
FROM (
SELECT DISTINCT D.BusNr, dbo.fnConcatenateStopNames (D.BusNr, D.Date) Stops
FROM TempDB.dbo.Data D
) Data
编辑:使用提供的信息...
使用我提供的功能,针对您的全部设置,将解析一串停靠点、busnr 和日期...将您的路径数据聚合到路线计数中。
根据所有路线的总和使用路线计数,您可以确定每辆公共汽车的路线比率。
如果您将它用于我作为最后声明发布的路由列表,您也可以推断出最频繁的服务停止:)
我有一个简单的任务要做。虽然可能无法使用 TSQL.
我想根据元素的顺序比较 SQL table 的分区(例如巴士路线的停靠顺序)。这是我的 table:
ID BusNr Seq StopName Date
1 789 1 A 2015-04-08
2 789 2 B 2015-04-08
3 789 3 C 2015-04-08
4 789 4 D 2015-04-08
5 789 1 A 2015-04-16
6 789 2 B 2015-04-16
7 789 3 D 2015-04-16
8 789 1 A 2015-05-10
9 789 2 B 2015-05-10
10 789 3 C 2015-05-10
11 789 4 D 2015-05-10
12 789 5 E 2015-05-10
示例显示了一条公交线路,它在三个不同的日期采用不同的路线。路线由停止序列给出。我需要的是找到一种方法来引用路线的停靠顺序,并为每条公交线路找到唯一的停靠顺序。然后我想创建一个 table 的唯一停止序列(每个都有索引),我可以连接到上面的 table。
是否可以根据此类序列的标识执行连接?
请给我任何建议来解决我的问题。我想知道我是否可以使用 window 功能,但目前我没有找到解决方案。
[评论太少] 我很想帮忙,但我不清楚你的 objective。 我明白了: 路线是唯一的停靠点列表。 不同的日子有不同的路线。 我想要每条公交线路的不同路线。
Maybe you want this:
1. 789 ABC,
2. 789 ABD,
3. 789 ABCDE
加入时,您需要另一条信息来使其独一无二,因为 BusLine 上存在 3 个可能的匹配项,以便与日期联系起来……您可以计算出第 1 周、第 2cnd 周……做你同意吗?
如果是这样,您需要决定是要在每条路线中使用 1 行,还是将其拆分为:
PK INT, BusNr INT, RouteStopSeq INT, RouteStopName CHAR, RouteWeekNumber INT
1, 789, 1, A, 1
2, 789, 2, B, 1
3, 789, 3, C, 1
4, 789, 1, A, 2
5, 789, 2, B, 2
6, 789, 3, D, 2
...
SO...每天都有不同的路线使得 table 您想要创建的数据与您提供的数据相同...很难从如此小的集合中看出整体模式。
CREATE TABLE TempDB.dbo.Data
(
ID INT,
BusNr INT,
Seq INT,
StopName CHAR(1),
Date DATETIME
)
INSERT INTO TempDB.dbo.Data VALUES
( 1,789,1,'A','2015-04-08'),
( 2,789,2,'B','2015-04-08'),
( 3,789,3,'C','2015-04-08'),
( 4,789,4,'D','2015-04-08'),
( 5,789,1,'A','2015-04-16'),
( 6,789,2,'B','2015-04-16'),
( 7,789,3,'D','2015-04-16'),
( 8,789,1,'A','2015-05-10'),
( 9,789,2,'B','2015-05-10'),
(10,789,3,'C','2015-05-10'),
(11,789,4,'D','2015-05-10'),
(12,789,5,'E','2015-05-10')
CREATE FUNCTION fnConcatenateStopNames (@BusNr INT, @Date DATETIME)
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @RouteStopList VARCHAR(MAX) = ''
SELECT @RouteStopList = @RouteStopList + ',' + CONVERT(VARCHAR(10),StopName)
FROM TempDB.dbo.Data D
WHERE D.BusNr = @BusNr
AND D.Date = @Date
ORDER BY Seq
RETURN STUFF(@RouteStopList,1,1,'')
END
SELECT BusNr, Stops, ROW_NUMBER() OVER (ORDER BY BusNr, Stops) BusRouteNumber
FROM (
SELECT DISTINCT D.BusNr, dbo.fnConcatenateStopNames (D.BusNr, D.Date) Stops
FROM TempDB.dbo.Data D
) Data
编辑:使用提供的信息... 使用我提供的功能,针对您的全部设置,将解析一串停靠点、busnr 和日期...将您的路径数据聚合到路线计数中。
根据所有路线的总和使用路线计数,您可以确定每辆公共汽车的路线比率。
如果您将它用于我作为最后声明发布的路由列表,您也可以推断出最频繁的服务停止:)