Найти уникальные наборы строк - PullRequest
1 голос
/ 10 ноября 2010

У меня в Access 2003 есть таблица со следующими полями

Ptr_RateTable
MinOfWeight_Up_To
Adder

Мне нужно найти уникальные значения MinOfWeight_Up_To для любой таблицы, без отображения имен таблиц в моих результатах. Я пытаюсь сжать размеры таблиц в мэйнфрейме, найдя таблицы, которые могут быть сжаты при одинаковых перерывах в весе.

Так например

Ptr_RateTable|MinOfWeight_Up_To
1109LW020|1.00
1109LW020|2.00
1109LW020|6.00
1109LW020|11.00
1109LW020|101.00
1109LW020|128.00
1109LW020|129.00
1109LW021|1.00
1109LW021|2.00
1109LW021|3.00
1109LW021|11.00
1109LW021|36.00
1109LW021|41.00
1109LW021|151.00

Я хотел бы видеть следующее в результате, а не создавать еще один «Профиль» с такими же весами.

Profile1|1.00|2.00|6.00|11.00|101.00|128.00|129.00
Profile2|1.00|2.00|3.00|11.00|36.00|41.00|151.00

Ответы [ 2 ]

0 голосов
/ 11 ноября 2010

Использование запроса кросс-таблицы:

Dim rs As New ADODB.Recordset
Dim cn As New ADODB.Connection

Set cn = CurrentProject.Connection

sSQL = "TRANSFORM Min(s.MinOfWeight_Up_To) AS Min_Weight " _
& "SELECT 'Profile' & Right([Ptr_RateTable],2) AS Profile " _
& "FROM Sample s " _
& "GROUP BY s.Ptr_RateTable " _
& "PIVOT s.MinOfWeight_Up_To"

rs.Open sSQL, cn

astr = rs.GetString
Do While InStr(astr, Chr(9) & Chr(9)) > 0
    astr = Replace(astr, Chr(9) & Chr(9), Chr(9))
Loop

Debug.Print astr
0 голосов
/ 10 ноября 2010

Во-первых, вам нужна функция, которая генерирует подпись для этой таблицы.Что-то похожее на:

Public Function GetSignature(sTableName As String) As String

Dim oDB As DAO.Database
Dim oRS As DAO.Recordset
Dim sSQL As String
Dim sResult As String

sSQL = "Select Distinct MinOfWeight_Up_To" _
    & vbCrLf & "From [" & sTableName & "]"
    & vbCrLf & "Order By MinOfWeight_Up_To"

Set oDB = DBEngine.Workspaces(0).Databases(0)
Set oRS = oDB.OpenRecordset(sSQL, dbOpenForwardOnly, dbReadOnly)

Do Until oRS.EOF
    sResult = sResult & "|" & Nz(oRS(0))
    oRS.MoveNext
Loop

GetSignature = result

Set oRS = Nothing
Set oDB = Nothing

End Function

Как только вы это сделаете, вам понадобится другая подпрограмма, которая собирает список таблиц, вызывает вышеуказанную подпись для каждой таблицы и сохраняет результат во временной таблице.Затем вы запросите у этой временной таблицы уникальный список подписей.

Следует отметить, что миллиарды конкатенаций строк будут очень медленными.Вместо этого вам следует искать реализации более эффективного класса построителя строк, который вы можете использовать для создания сигнатур.

...