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

プライマリRowId(前の質問のリスト)を、次の基準で一致するRowIdとグループ化するリストが必要です。

  • Primary行とMatching行では、以下が同じである必要があります。
    • トレイン番号
    • DayType
    • 時間
  • プライマリ行とマッチング行では、プレートが異なる必要があります
  • ワゴンは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に、テーブルのペア(実際には同じテーブルの2つのコピー)で一致するものを見つけるように指示する必要があります。これは自己結合として知られています。

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の2つのコピーには、エイリアスAとBが付けられています。

INNER JOIN行で、一致する必要のあるフィールドを指定します。

WHERE行では、異なる必要のあるフィールドと、その他の条件(AとBの両方に指定する必要がある)を指定します。

最初の列は、一致する各トレインの最小の行IDを示し、2番目の列は他の一致する行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;

SQLFiddleで少し追加のテストデータを使用してこれをテストしました

于 2013-02-04T21:50:03.547 に答える