Jak zwrócić wartość elementu tablicy w jednym z moich wejść, w których indeks znajduje się w stale zmienia sposób?

Jestem pewien, że struktura mojego zapytania jest poprawna. Mam dwa wejścia i używam połączenia i pomyślnie otrzymuję kilka danych z obu tabel. Jednak muszę uzyskać zdejmękę z Tabeli B, ale jest w tablicy w formacie JSON.

Moje zapytanie

Tutaj jest w tekście, jeśli chcesz łatwo skopiować, wkleić i / lub edytować:

SELECT  
A.context.data.eventTime as eventTime,
A.context.device.type as deviceType,
A.context.[user].anonId as userId,
A.context.device.roleInstance as machineName,
B.context.operation.name as eventName,
B.context.custom.dimensions[0],
--B.GetRecordPropertyValue(GetArrayElement(B.context.custom.dimensions,7), B.RemoteIpAddress) as remoteIpAddress,
--GetArrayElement(B.context.custom.dimensions,3),
--B.GetRecordPropertyValue(GetArrayElement(B.context.custom.dimensions,3), B.userName) as userName,
DATEDIFF(minute,A.context.data.eventTime,B.context.data.eventTime) as durationInMinutes



INTO DevUserlgnsOutput

FROM DevUserlgnsInput A TIMESTAMP BY A.context.data.eventTime

JOIN DevUserlgnsInput2 B TIMESTAMP BY B.context.data.eventTime
ON DATEDIFF(minute,A,B) BETWEEN 0 AND 5

Komcentowane linie nie działają, więc skomentowałem je.

Spojrzałem na to i zobaczyłem zalecenia do użycia GetRecordpropertyValue i Getarraylement, więc zrobiłem. Nie mam błędów, ale powraca zerowy.

Odkryłem również, że jeśli zrobię b.context.custom.dimensions [0], pełna tablica, w tym element, który chcę zobaczyć, jest zwrócona.

Aby jeszcze bardziej komplikować rzeczy, zdałem sobie sprawę, że pozycja elementu, którą chcę w tablicy, nie zawsze jest taki sam. W niektórych przykładowych danych, jest 7, inni to 3.

Z góry dziękuję.

Aktualizacja po przeczytaniu odpowiedzi:

Moje nowe zapytanie:

SELECT 
Events.context.data.eventTime as eventTime,
Events.context.device.type as deviceType,
mDim.ArrayValue.MachineName as machineName,
mDim.ArrayValue.UserId as userID,
mDim.ArrayValue.RemoteIpAddress as remoteIpAddress,
mDim.ArrayValue.UserName as userName,
mDim.ArrayValue.EventName as eventName

INTO DevUserlgnsOutput

FROM DevUserlgnsInput2 Events

CROSS APPLY GetArrayElements(Events.context.custom.dimensions) AS mDim

Problem: Mam teraz wiele wierszy dla pojedynczego zdarzenia, każdy wyświetla się 1 atrybut, który chcę śledzić (reszta kolumn w każdym wierszu odnosząca się do tablicy są null). Jakieś myśli, jak to naprawić?

1
jmrpink 4 czerwiec 2018, 15:40

3 odpowiedzi

Najlepsza odpowiedź

Moje rozwiązanie:

    WITH Events AS

(

SELECT

  context.data.EventTime as eventTime,

  context.device.type as deviceType,

  GetRecordPropertyValue(GetArrayElement(context.custom.dimensions, 7), 'MachineName') AS machineName,

  GetRecordPropertyValue(GetArrayElement(context.custom.dimensions, 8), 'UserName') AS userName,

  GetRecordPropertyValue(GetArrayElement(context.custom.dimensions, 2), 'remoteIpAddress') AS remoteIpAddress,

  GetRecordPropertyValue(GetArrayElement(context.custom.dimensions, 0), 'EventName') AS eventName,

  CASE WHEN GetRecordPropertyValue(GetArrayElement(context.custom.dimensions, 12), 'UserId') is NULL THEN GetRecordPropertyValue(GetArrayElement(context.custom.dimensions, 11), 'UserId') ELSE GetRecordPropertyValue(GetArrayElement(context.custom.dimensions, 12), 'UserId') END as userId


FROM ProdUserlgnsInput

)


SELECT eventTime, deviceType, MachineName, UserId, UserName, remoteIpAddress, eventName  INTO ProdUserlgnsOutput FROM Events

Musiałem jednak przenieść właściwość EventName do głównej tablicy, ponieważ z instrukcją, której próbowałem użyć do uzyskania informacji z 2 oddzielnych tablic, nie pozwalał mi umieścić wyników w jednym wyjściu. Dodatkowo, ponieważ indeks użytkownika był głównie 12, ale czasami 11. Tak, aby wyświetlić rzeczywisty identyfikator użytkownika dla wszystkich rekordów, używałem "etui".

Dużo pracowałem, aby rozwiązać ten problem, więc jeśli ktoś chce więcej szczegółów, proszę zapytać.

0
jmrpink 26 czerwiec 2018, 17:58

Poniżej zapytania pasuje do ostatniej struktury tablicy, wypróbuj:

SELECT   
context.data.EventTime as eventTime,
context.device.type as deviceType,
GetRecordPropertyValue(GetArrayElement(context.custom.dimensions, 4), 'MachineName') AS machineName,  
GetRecordPropertyValue(GetArrayElement(context.custom.dimensions, 5), 'UserId') AS userId,
GetRecordPropertyValue(GetArrayElement(context.custom.dimensions, 9), 'UserName') AS userName,
GetRecordPropertyValue(GetArrayElement(context.custom.dimensions, 11), 'remoteIpAddress') AS remoteIpAddress,
GetRecordPropertyValue(GetArrayElement(context.custom.dimensions, 13), 'EventName') AS eventName     
INTO output1
FROM input1
0
Abiodun O. 14 czerwiec 2018, 20:29

Możesz użyć UDF

function arraygetvaluebyname(arg, name) {
    var z = arg;
    for(var i=0;i<z.length;i++){
        if(name === Object.keys(z[i])[0])
        {
            return z[i][name];
        }
    }
    return null;
}
0
MKS 20 maj 2019, 14:16