1
votes

Définir des valeurs pour tous les enregistrements dans une table Kdb en fonction des valeurs d'autres colonnes

Je dois effectuer une mise à jour globale sur une table KDB pour mettre à jour deux colonnes. Pour la colonne FirstName, je souhaite supprimer sa valeur pour les enregistrements qui ont une chaîne vide dans la colonne SecondName, et pour la colonne FullName, je souhaite remplacer un délimiteur codé par un espace pour toutes les lignes de la table.

Cela n'est pas nécessaire être fait dans une seule instruction de mise à jour si cela aide.

update
    FirstName:$[SecondName like ""; FirstName; ""],
    FullName[FullName; " "; " "]
    from table
    }

J'ai du mal avec la syntaxe - ce qui précède est ma meilleure tentative mais cela ne fonctionne pas.

kdb

1 commentaires

Si cela vous aide, pensez à des références à des noms de colonnes comme des vecteurs, pas à des scalaires ...


4 Réponses :


2
votes

Une façon d'y parvenir en une seule instruction de mise à jour:

q) update FirstName:?[SecondName like ""; SecondName;FirstName], FullName:ssr[;" "; " "]@'FullName from table


2 commentaires

Blimey - c'était rapide :) J'ai rafraîchi la page il y a seulement 10 minutes et je ne l'ai pas actualisée à nouveau avant de publier ma propre solution - la vôtre est certainement plus belle que la mienne, merci!


Heureux que cela ait aidé.



1
votes

Je recommanderais de le faire en deux étapes

//create table with mock data
table: ([]FirstName: ("aaa";"ccc"); SecondName: ("bbb";""); FullName: ("aaa bbb";"ccc "));
//step1: set First to "" whenever SecondName is ""
table: update FirstName: (count i)#enlist"" from table where SecondName like "";
//step2: replace spaces in FullName
table: update FullName: ssr[;" ";" "] each FullName from table;


1 commentaires

Hah - très similaire au mien - étonné du nombre de réponses que j'ai eu si rapidement - merci beaucoup :)



2
votes

Pour votre mise à jour du prénom, vous avez besoin d'un? plutôt qu'un $ comme opérateur de contrôle d'exécution. Comme il le fait, l'exécution avec une liste plutôt qu'un atome. Pour le FullName, vous devrez utiliser ssr, qui trouve où la chaîne a "& nbsp" et le remplace par ""

Ce qui donnerait ce qui suit:

q)tab:([]FirstName:("aa";"cc");SecondName:("";"dd");FullName:("aa ";"cc dd"))
q)update FirstName:?[SecondName like ""; count[FirstName]#enlist""; FirstName],FullName:ssr[; " ";" "]each FullName from tab
FirstName SecondName FullName
-----------------------------
""        ""         "aa "
"cc"      "dd"       "cc dd"

J'espère que ceci répond à votre question.

Cordialement, Ponceuse


1 commentaires

Merci beaucoup Sander - il semble qu'il existe de nombreuses façons d'obtenir ce résultat. J'ai quelque chose qui fonctionne maintenant, donc je ne perdrai pas de temps à essayer toutes les solutions proposées, mais j'apprécie vraiment votre contribution :)



1
votes

Compris, je pense:

table:update FirstName:(count i)#enlist "" from table where SecondName like "";
table:update FullName:{ ssr[x; " "; " "] } each FullName from table where FullName like "* *";


0 commentaires