1

在我之前的问题(基于一系列列车编号选择不同的 RowId)中,我得到了一个不错的 RowId 列表。

现在我想让这个列表完整并且非常棒!:)

我的原始数据(Excel 2010)如下所示:

Time    Wagons     Delete     DayType    Plate    trainnumber   RowId
05.28    1                       1      0901-046     2          38676
08.20    2                       1      0901-003     2          18676
05.25    2            x          1      0901-046     2          28676
15.28    2                       1      0901-046     2          3676
23.20    3                       1      0601-001     2          3867
05.08    3                       1      0901-046     2          3876
00.28    L            x          1      0901-046     2          8676
00.00                            1      0901-046     2          367

我需要一个列表,将 Primary RowIds(上一个问题的列表)与符合以下条件的 RowIds 分组:

  • 在主要行和匹配行上,以下内容必须相同:
    • 车次
    • 日型
    • 时间
  • 在主要行和匹配行上,板必须不同
  • Wagons 必须 MORE THAN 1 (该列包含带有数字、字母和任何内容的行)
  • 删除必须为空

找到匹配项后,我需要匹配项的 RowId。

理想情况下是这样的数据集:

PrimaryRowId    Match#1    Match#2    Match#3    Match#4
15674            5465        456       5456        45656
5564             231         132       1321        7862

每个 Primary RowId 可能有更多匹配项,但没关系。

我的 SQL 技能有些有限,所以这就是我问你们的原因。:)

认为它可能是这样的:

SELECT RowId
FROM Conversion
WHERE trainnumber=trainnumber and daytype=daytype and 
      time=time and plate<>plate and Wagons>1 and delete="" 
GROUP BY RowId

但它一次只会给我一 (1) 个 RowId。:-/

4

1 回答 1

1

克里斯,

要使用 SQL 来匹配这样的项目,您需要告诉 SQL 在一对表(实际上是同一个表的两个副本)中查找匹配项。这称为自联接。

SELECT A.Time,
       A.TrainNumber,
       A.DayType,
       MIN(A.Rowid) AS Master
FROM CONVERSION AS A
INNER JOIN CONVERSION AS B ON A.TrainNumber=B.TrainNumber
AND A.DayType=B.DayType
AND A.Time=B.Time
WHERE A.Wagons>"1"
  AND B.Wagons>"1"
  AND A.Plate<>B.Plate
  AND A.Delete IS NULL
  AND B.Delete IS NULL
GROUP BY A.Time,
         A.TrainNumber,
         A.DayType;

Conversion 的两个副本被赋予别名 A 和 B。

在 INNER JOIN 行上,我们指定必须匹配的字段。

在 WHERE 行上,我们指定必须不同的字段,以及其他条件(必须为 A 和 B 指定)。

第一列给出每个匹配列车的最低行 ID,第二列给出其他匹配行 ID。

现在我们有一个主行列表,我们可以再次将其加入 Conversion 以生成一个从行列表:

SELECT D.Master,
       C.Rowid
FROM CONVERSION AS C
INNER JOIN
  (SELECT A.Time,
          A.TrainNumber,
          A.DayType,
          MIN(A.Rowid) AS Master
   FROM CONVERSION AS A
   INNER JOIN CONVERSION AS B ON A.TrainNumber=B.TrainNumber
   AND A.DayType=B.DayType
   AND A.Time=B.Time
   WHERE A.Wagons>"1"
     AND B.Wagons>"1"
     AND A.Plate<>B.Plate
     AND A.Delete IS NULL
     AND B.Delete IS NULL
   GROUP BY A.Time,
            A.TrainNumber,
            A.DayType) AS D ON C.TrainNumber=D.TrainNumber
AND C.DayType=D.DayType
AND C.Time=D.Time
WHERE C.Delete IS NULL
  AND D.Master<C.Rowid
ORDER BY D.Master,
         C.Rowid;

我已经用SQL Fiddle上的一些额外测试数据对此进行了测试

于 2013-02-04T21:50:03.547 回答