2017-07-05 2 views
0

Ich habe den Code untenExtrahieren Reihe von Daten in einer großen Abfrage

select --split(INDIVIDUAL_NAMES, '->') as Assigned_to_individual, 

regexp_extract(split(INDIVIDUAL_NAMES, '->'),r'(\d\d/\d\d/\d\d\d\d \d\d:\d\d:\d\d)') from [table name ]where _ID in('071632') 

Hier stellen wir Datum extrahieren müssen verwendet, und ich habe es einen Versuch gegeben durch d verwenden, damit es mir numerische Felder gibt, aber das ist nicht gib mir das komplette Datum.

+0

Es würde viel helfen, Ihre Eingabedaten zu sehen –

+0

Bitte ein Beispiel Wert von 'INDIVIDUAL_NAMES' geben. –

+0

Bitte bearbeiten Sie Ihre Frage, um ein [minimales, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/help/mcve) des Codes anzuzeigen, mit dem Sie Probleme haben. Dann können wir versuchen, mit dem spezifischen Problem zu helfen . Sie können auch [Wie Sie fragen] (http://stackoverflow.com/help/how-to-ask) lesen. –

Antwort

1

Unten ist für BigQuery Standard-SQL

#standardSQL 
WITH yourTable AS ( 
    SELECT 1 AS id, 'Start -> (11/11/2016 08:24:24 AM) -> Akumar (11/11/2016 11:15:33 AM) -> Akumar (01/06/2017 08:08:44 PM) -> Akumar (01/30/2017 10:34:33 AM) -> Akumar (03/15/2017 02:10:12 PM) -> Akumar (03/23/2017 12:42:52 PM) -> Akumar (06/20/2017 12:52:27 PM) -> (06/27/2017 05:30:48 PM) -> Sneha Singh (06/28/2017 03:11:34 AM)' AS INDIVIDUAL_NAMES 
) 
SELECT 
    id, 
    LTRIM(SPLIT(CONCAT(' ', item), ' (')[OFFSET(0)]) AS name, 
    REGEXP_EXTRACT(item, r'(\d\d/\d\d/\d\d\d\d \d\d:\d\d:\d\d [AP]M)') AS date_as_string, 
    PARSE_DATETIME('%m/%d/%Y %r', REGEXP_EXTRACT(item, r'(\d\d/\d\d/\d\d\d\d \d\d:\d\d:\d\d [AP]M)')) AS date_as_datetime, 
    PARSE_TIMESTAMP('%m/%d/%Y %r', REGEXP_EXTRACT(item, r'(\d\d/\d\d/\d\d\d\d \d\d:\d\d:\d\d [AP]M)')) AS date_as_timestamp 
FROM yourTable, UNNEST(SPLIT(INDIVIDUAL_NAMES, ' -> ')) AS item 
-- ORDER BY 3 

oben leicht redundante Teile entfernen vereinfacht werden kann - beispielsweise als

#standardSQL 
WITH yourTable AS ( 
    SELECT 1 AS id, 'Start -> (11/11/2016 08:24:24 AM) -> Akumar (11/11/2016 11:15:33 AM) -> Akumar (01/06/2017 08:08:44 PM) -> Akumar (01/30/2017 10:34:33 AM) -> Akumar (03/15/2017 02:10:12 PM) -> Akumar (03/23/2017 12:42:52 PM) -> Akumar (06/20/2017 12:52:27 PM) -> (06/27/2017 05:30:48 PM) -> Sneha Singh (06/28/2017 03:11:34 AM)' AS INDIVIDUAL_NAMES 
) 
SELECT 
    id, 
    LTRIM(SPLIT(CONCAT(' ', item), ' (')[OFFSET(0)]) AS name, 
    date_as_string, 
    PARSE_DATETIME('%m/%d/%Y %r', date_as_string) AS date_as_datetime, 
    PARSE_TIMESTAMP('%m/%d/%Y %r', date_as_string) AS date_as_timestamp 
FROM yourTable, 
    UNNEST(SPLIT(INDIVIDUAL_NAMES, ' -> ')) AS item, 
    UNNEST([REGEXP_EXTRACT(item, r'(\d\d/\d\d/\d\d\d\d \d\d:\d\d:\d\d [AP]M)')]) AS date_as_string 
-- ORDER BY 3 

Ausgang ist als unten

id name  date_as_string   date_as_datetime date_as_timestamp  
1 Start  null     null    null  
1 Akumar  01/06/2017 08:08:44 PM 2017-01-06T20:08:44 2017-01-06 20:08:44 UTC 
1 Akumar  01/30/2017 10:34:33 AM 2017-01-30T10:34:33 2017-01-30 10:34:33 UTC 
1 Akumar  03/15/2017 02:10:12 PM 2017-03-15T14:10:12 2017-03-15 14:10:12 UTC 
1 Akumar  03/23/2017 12:42:52 PM 2017-03-23T12:42:52 2017-03-23 12:42:52 UTC 
1 Akumar  06/20/2017 12:52:27 PM 2017-06-20T12:52:27 2017-06-20 12:52:27 UTC 
1    06/27/2017 05:30:48 PM 2017-06-27T17:30:48 2017-06-27 17:30:48 UTC 
1 Sneha Singh 06/28/2017 03:11:34 AM 2017-06-28T03:11:34 2017-06-28 03:11:34 UTC 
1    11/11/2016 08:24:24 AM 2016-11-11T08:24:24 2016-11-11 08:24:24 UTC 
1 Akumar  11/11/2016 11:15:33 AM 2016-11-11T11:15:33 2016-11-11 11:15:33 UTC 

wirklich groß sein würde, wenn Sie

ein ähnliches Beispiel in Legacy-SQL vorschlagen können, können Sie unten für BigQuery Legacy-SQL

versuchen
#legacySQL 
SELECT 
    id, 
    IF(name = CONCAT('(', date_as_string, ')'), '', name) AS name, 
    date_as_string 
FROM (
    SELECT 
    id, 
    NTH(1, SPLIT(item, ' (')) AS name, 
    REGEXP_EXTRACT(item, r'(\d\d/\d\d/\d\d\d\d \d\d:\d\d:\d\d [AP]M)') AS date_as_string 
    FROM FLATTEN((
    SELECT id, SPLIT(INDIVIDUAL_NAMES, ' -> ') AS item, INDIVIDUAL_NAMES 
    FROM yourTable 
), item) 
) 
-- ORDER BY date_as_string 

Sie können es mit Dummy-Daten testen Sie vorgesehen, wie unten

#legacySQL 
SELECT 
    id, 
    IF(name = CONCAT('(', date_as_string, ')'), '', name) AS name, 
    date_as_string 
FROM (
    SELECT 
    id, 
    NTH(1, SPLIT(item, ' (')) AS name, 
    REGEXP_EXTRACT(item, r'(\d\d/\d\d/\d\d\d\d \d\d:\d\d:\d\d [AP]M)') AS date_as_string 
    FROM FLATTEN((
    SELECT id, SPLIT(INDIVIDUAL_NAMES, ' -> ') AS item, INDIVIDUAL_NAMES 
    FROM (
     SELECT 1 AS id, 'Start -> (11/11/2016 08:24:24 AM) -> Akumar (11/11/2016 11:15:33 AM) -> Akumar (01/06/2017 08:08:44 PM) -> Akumar (01/30/2017 10:34:33 AM) -> Akumar (03/15/2017 02:10:12 PM) -> Akumar (03/23/2017 12:42:52 PM) -> Akumar (06/20/2017 12:52:27 PM) -> (06/27/2017 05:30:48 PM) -> Sneha Singh (06/28/2017 03:11:34 AM)' AS INDIVIDUAL_NAMES 
    ) AS yourTable 
), item) 
) 
ORDER BY date_as_string 
+0

das wäre wirklich toll, wenn Sie eine ähnliche Instanz in Legacy-SQL vorschlagen können, wie die Tabellen, die wir nicht Standard-SQL unterstützen. Dieses Feld ist nur eine der Spalten, die wir abrufen, während wir mit Legacy-SQL bereits mehrere Spalten erstellt haben und diese Tabelle leider keine Standard-SQL unterstützt. –

+1

Ich empfehle, zu BigQuery Standard SQL zu wechseln, sobald Sie können - Zwischenzeit Version für Legacy SQL –

+0

sehen dies ist ein Lebensretter, ein großes Lob an Sie –

1

Da ich keinen Zugriff auf Ihre Tabelle habe, habe ich die WITH-Klausel verwendet, um Ihre Eingabetabelle zu emulieren, wobei das mitgelieferte Eingabe-Beispiel verwendet wurde. Die folgende Abfrage erzeugt damit die gewünschten Ausgabedaten. Beachten Sie, dass dies ein StandardSQL query:

#standardSQL 
WITH 
    input AS (
    SELECT 
    "Start -> (11/11/2016 08:24:24 AM) -> Akumar (11/11/2016 11:15:33 AM) -> Akumar (01/06/2017 08:08:44 PM) -> Akumar (01/30/2017 10:34:33 AM) -> Akumar (03/15/2017 02:10:12 PM) -> Akumar (03/23/2017 12:42:52 PM) -> Akumar (06/20/2017 12:52:27 PM) -> (06/27/2017 05:30:48 PM) -> Sneha Singh (06/28/2017 03:11:34 AM)" AS input_group), 
    split_output AS (
    SELECT 
    SPLIT(input_group, "->") AS output 
    FROM 
    input) 
SELECT 
    REGEXP_EXTRACT(output,r"(\d\d/\d\d/\d\d\d\d \d\d:\d\d:\d\d)") AS date 
FROM 
    split_output so, 
    so.output 

Ausgang (null ist für den "Start" -Eintrag - beachten Sie, dass SQL-Ausgabe nicht bestellt wird):

Row date  
1 03/15/2017 02:10:12 
2 01/06/2017 08:08:44 
3 11/11/2016 08:24:24 
4 06/20/2017 12:52:27 
5 06/28/2017 03:11:34 
6 01/30/2017 10:34:33 
7 06/27/2017 05:30:48 
8 null  
9 11/11/2016 11:15:33 
10 03/23/2017 12:42:52 
Verwandte Themen