Как переупорядочить порядковый номер (не идентификатор) в таблице на основе общей группировки с использованием SQL / Access? - PullRequest
0 голосов
/ 26 марта 2020

В таблице 1 приведен пример данных из таблицы для одного Item_ID (есть тысячи. Общее количество записей превышает 500 тыс.). Проблема в том, что порядковый номер часто дублируется (например, см. «01» появляется 3 раза для того же Item_ID). Нет последовательности больше 12. Мне нужно выяснить способ, используя MS Access / SQL для преобразования таблицы так, чтобы последовательность корректировалась на основе идентификатора (см. 2-ую таблицу для вывода), и нумерация последовательная после 12.

Я показал желаемый результат для образца в таблице 2.

Я могу сделать это в Excel, используя уравнения, но это неэффективно для количества данных, которые у меня есть.

Есть идеи?

**Table 1**
-------
Item_ID     ItemRoute   Sequence    ID
----------------------------------------------
0-X342-41   00_0KF07L   01      56
0-X342-41   00_0KG05E   01      60
0-X342-41   00_CND      01      70
0-X342-41   00_0KA21G   02      52
0-X342-41   00_0KR35G   02      64
0-X342-41   00_0KA21A   03      51
0-X342-41   00_0KG05F   03      61
0-X342-41   00_0KR05C   04      62
0-X342-41   00_EP       04      71
0-X342-41   00_0KR05F   05      63
0-X342-41   00_41396    05      67
0-X342-41   00_0KG05A   06      57
0-X342-41   00_EP       06      72
0-X342-41   00_44642    07      68
0-X342-41   00_EP       07      73
0-X342-41   00_0KF07A   08      53
0-X342-41   00_41368    08      66
0-X342-41   00_0KG05B   09      58
0-X342-41   00_EP       09      74
0-X342-41   00_44645    10      69
0-X342-41   00_EP       10      75
0-X342-41   00_0KF07B   11      54
0-X342-41   00_41357    11      65
0-X342-41   00_0KF07K   12      55
0-X342-41   00_0KG05C   12      59
**Table 2**
-------
Item_ID     ItemRoute   Sequence    ID
-----------------------------
0-X342-41   00_0KF07L   01      56
0-X342-41   00_0KG05E   13      60
0-X342-41   00_CND      25      70
0-X342-41   00_0KA21G   02      52
0-X342-41   00_0KR35G   14      64
0-X342-41   00_0KA21A   03      51
0-X342-41   00_0KG05F   15      61
0-X342-41   00_0KR05C   04      62
0-X342-41   00_EP       16      71
0-X342-41   00_0KR05F   05      63
0-X342-41   00_41396    17      67
0-X342-41   00_0KG05A   06      57
0-X342-41   00_EP       18      72
0-X342-41   00_44642    07      68
0-X342-41   00_EP       19      73
0-X342-41   00_0KF07A   08      53
0-X342-41   00_41368    20      66
0-X342-41   00_0KG05B   09      58
0-X342-41   00_EP       21      74
0-X342-41   00_44645    10      69
0-X342-41   00_EP       22      75
0-X342-41   00_0KF07B   11      54
0-X342-41   00_41357    23      65
0-X342-41   00_0KF07K   12      55
0-X342-41   00_0KG05C   24      59

1 Ответ

0 голосов
/ 26 марта 2020

Один из способов сделать это - использовать пару вложенных наборов записей и l oop через них, сохраняя счетчики вне их. Похоже, что это работает на показанных данных:

Dim db As DAO.Database
Dim rsID As DAO.Recordset
Dim rsSequence As DAO.Recordset
Dim strSQL As String
Dim intSequence As Integer
Dim intID As Integer
Set db = DBEngine(0)(0)
db.Execute "DELETE * FROM Table2;"
strSQL = "SELECT DISTINCT Sequence FROM Table1 ORDER BY Sequence;"
Set rsSequence = db.OpenRecordset(strSQL)
If Not (rsSequence.BOF And rsSequence.EOF) Then
    intSequence = 0
    Do
        intID = 1
        strSQL = "SELECT DISTINCT ID FROM Table1 WHERE Sequence=" & rsSequence!Sequence & " ORDER BY ID;"
        Set rsID = db.OpenRecordset(strSQL)
        If Not (rsID.BOF And rsID.EOF) Then
            Do
                db.Execute "INSERT INTO Table2 (PK,Item_ID, ItemRoute, Sequence, ID) " _
                    & " SELECT PK,Item_ID, ItemRoute, " & intSequence + intID & ", ID " _
                    & " FROM Table1 " _
                    & " WHERE ID=" & rsID!ID & " AND Sequence=" & rsSequence!Sequence
                intID = intID + 12
                rsID.MoveNext
            Loop Until rsID.EOF
        End If
        intSequence = intSequence + 1
        rsSequence.MoveNext
    Loop Until rsSequence.EOF
End If

С уважением,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...