Suite

Ecriture d'une requête dans "Select_analysis" pour comparer la chaîne d'une colonne avec une autre colonne ?

Ecriture d'une requête dans


J'ai un fichier shp (s.shp) avec la colonne "A" et la colonne "B". J'essaie de copier à partir de ce fichier uniquement les lignes où la valeur de chaîne de la colonne "A" fait partie de la valeur de chaîne de la colonne "B", par ex.

A 0,1 0,2 0,3 B 0,12 0,21 0,43

Le fichier de sortie doit avoir deux lignes, une première et une deuxième.

j'essaye de faire :

import arcpy source="c:MYs.shp" output="c:MYo.shp" arcpy.Select_analysis(source,output,""B" like '%'|| "A"||'%'")

mais j'ai une erreur :(

ERREUR 000358 : expression non valide "B" comme '%'||"A"||'%'

J'utilise ArcMap 10.1.


Si votre exemple est typique de ce que vous essayez de sélectionner, alors si vous convertissez votre jeu de données en entrée en une classe d'entités de géodatabase fichier, vous pouvez utiliser l'expression sql :

SOUS-CHAINE( B, 1 , 3) ​​= A

Cela sélectionnera les lignes où les 3 premiers caractères du champ B correspondre à l'ensemble du contenu du champ UNE.


SQL : SELECT Toutes les colonnes sauf certaines

Existe-t-il un moyen de SELECTIONNER toutes les colonnes d'une table, à l'exception de certaines ? IL serait très pratique pour sélectionner toutes les colonnes non blob ou non géométriques d'une table.

  • J'ai entendu une fois que cette fonctionnalité avait été délibérément exclue de la norme SQL, car la modification de l'ajout de colonnes à la table modifierait les résultats de la requête. Est-ce vrai? L'argument est-il valable ?
  • Existe-t-il une solution de contournement, en particulier dans PostgreSQL ?


Essayez plutôt cette requête sur vos données et dites comment elle fonctionne. Je ne suis pas sûr qu'il renverra exactement le même que votre requête, mais il devrait être suffisamment proche pour que vous puissiez vous adapter à ce que vous voulez.

Les parties qui devraient faire une différence sur les performances sont que j'ai remplacé l'utilisation de l'axe parent ../ par un appel supplémentaire à cross apply nodes() et je spécifie le nœud text() dans la fonction values().

En utilisant 1000 lignes et le XML fourni dans la question pour les deux colonnes XML, j'ai chronométré la requête ci-dessus à environ 4 minutes sur ma machine. Le plan d'exécution comporte deux branches chargées de déchiqueter chacune des deux colonnes XML. La mauvaise chose avec ce plan est que la deuxième branche est exécutée une fois pour chaque ligne sortant de la première branche. Ce serait bien mieux si le déchiquetage des colonnes pouvait être effectué indépendamment puis assemblés.

J'ai donc essayé cette réécriture de la requête.

Et ça a plutôt bien marché. Le temps d'exécution est tombé à 62 secondes. Le déchiquetage du XML est effectué une seule fois par colonne XML et le résultat de la deuxième branche est stocké dans un spool de table et ce spool est utilisé pour toutes les lignes sortant de la première branche.

Et si nous pouvions faire en sorte que les branches se joignent avec une jointure par fusion à la place. L'entrée d'une jointure par fusion doit être triée, nous nous attendons donc à voir deux tris supplémentaires dans le plan d'exécution.

Même requête que ci-dessus avec un indice de jointure de fusion.

Et cela a fonctionné comme prévu. Les branches sont triées, la jointure par fusion est utilisée et le temps d'exécution est à nouveau supprimé. Cette fois à 23 secondes.

Changer la jointure en une jointure de hachage était encore mieux une jointure de hachage interne, 13 secondes.

Une autre façon d'accélérer les choses consiste à déchiqueter le XML de chaque colonne en deux tables temporaires, puis à joindre les tables temporaires pour voir ce qui est différent.

Pour moi, c'était le moyen le plus rapide de faire la comparaison avec un temps d'exécution de 7 secondes.


Différences entre le langage M et le DAX

Dans la section précédente, nous avons connecté Power BI à un jeu de données factice sur GitHub. Dans cette section, vous verrez à l'aide d'exemples, les différences entre le langage M et le DAX.

Langue M

Tout d'abord, nous verrons ce qu'est M et comment il est utilisé dans Power BI. Comme je l'ai dit plus tôt, le langage M est utilisé pour gérer et filtrer les données dans l'éditeur de requête. Si vous avez fermé l'éditeur de requêtes, vous pouvez l'ouvrir en cliquant sur l'option “Modifier les requêtes” dans le menu du haut.

Dans l'éditeur de requête, le seul nom de table sur le panneau de gauche de l'écran sera votre table, comme indiqué ci-dessous. Cliquez sur le tableau de données “WA_Fn-UseC_-Telco-Customer-Churn” dans le panneau de gauche de l'éditeur de requête, comme indiqué ci-dessous :

Pour voir les requêtes dans M. Sélectionnez n'importe quelle colonne, par exemple, “Partenaire”, puis cliquez sur le bouton “Supprimer les colonnes” dans le menu du haut. Cela supprimera la colonne “Partner” du tableau, comme indiqué ci-dessous :

Ensuite, cliquez sur l'option “View” dans le menu du haut comme mis en évidence dans la capture d'écran suivante.

Cliquez sur la case à cocher “Formula Bar”. Vous devriez maintenant voir une requête dans la barre de formule comme mis en évidence dans la capture d'écran suivante. La requête ici est “= Table.RemoveColumns(#”Changed Type”,<“Partner”>). Cette requête est une requête en langage M utilisée pour supprimer la colonne “Partner” de la table sélectionnée. Vous pouvez voir que la requête en langage M est plus similaire à une commande SQL ou LINQ (Language Integrated Query) en C#.

Pour voir toutes les requêtes M précédemment exécutées dans votre ensemble de données, vous pouvez cliquer sur “View – Advanced Editor” comme indiqué dans la capture d'écran suivante.

Une fois que vous avez cliqué sur l'option “Advanced Editor” dans le menu du haut, vous devriez voir la fenêtre Advanced Editor comme illustré ci-dessous. La fenêtre de l'éditeur avancé contient toutes les requêtes en langage M que vous avez exécutées jusqu'à présent dans la session en cours.

Vous pouvez voir que la dernière requête est celle qui a supprimé la colonne “Partner” de la table. Avant cela, la requête “Change Type” est utilisée pour affecter les types de données à différentes colonnes de l'ensemble de données. Et avant cela, la requête “Promoted Headers” est utilisée pour définir les colonnes d'en-tête. Si vous exécutez une autre requête, celle-ci apparaîtra en bas de la liste des requêtes dans l'“Advance Editor”.

Essayons d'ajouter une colonne simple dans la table livres et voyons la requête M pour cela. Cliquez sur l'option “Ajouter une colonne -> Colonne personnalisée” dans le menu en haut de la fenêtre, comme vous pouvez le voir ci-dessous :

Vous devriez voir la fenêtre ci-dessous. Cliquez sur les colonnes “TotalCharges” et “MonthlyCharges” une par une, puis cliquez sur le bouton “Insert” pour les insérer dans la fenêtre de l'éditeur de requête. Dans la fenêtre de l'éditeur de requête, ajoutez un signe “+” entre les noms des deux colonnes et cliquez sur le bouton “OK”.

Vous devriez voir une nouvelle colonne “Monthly-Total” ajoutée au tableau, comme indiqué ci-dessous. Dans la barre de formule, vous pouvez également voir la requête M générée pour créer la colonne “Monthly-Total”. La colonne “Monthly-Total” affiche essentiellement la somme des valeurs dans les colonnes “TotalCharges” et “MonthlyCharges”.

Maintenant, si vous ouvrez à nouveau la fenêtre “Advanced Editor”, vous verrez la requête utilisée pour ajouter la colonne “Monthly-Total” au bas des requêtes dans l'éditeur avancé.

Nous savons maintenant comment fonctionne le langage M et à quoi il ressemble. Dans la section suivante, nous allons essayer de créer la même colonne “Monthly-Total 2” via DAX (Data Analysis Expression).

Les requêtes DAX sont exécutées dans la vue des données, nous devons donc déplacer les données de l'éditeur de requêtes vers la vue des données. Pour ce faire, dans l'éditeur de requête, cliquez sur l'option “Fermer et appliquer” dans le menu du haut, comme indiqué ci-dessous :

Une fois que vous avez cliqué sur le bouton “Fermer et appliquer”, la vue des données s'ouvre.

DAX (Expression d'analyse de données)

Dans cette section, nous verrons comment ajouter une nouvelle colonne à la table Books à l'aide de DAX. Dans la vue des données, cliquez sur l'option “Modélisation -> Nouvelle colonne” dans le menu du haut, comme indiqué ci-dessous :

Vous devriez voir la fenêtre suivante une fois que vous avez cliqué sur l'option “Nouvelle colonne”. Dans la barre de formule, vous pouvez voir le nom de colonne par défaut. Vous pouvez exécuter les requêtes DAX dans cette barre de formule.

Entrez la requête “Monthly-Total 2 = [TotalCharges] + [MonthlyCharges]” dans la barre de formule et appuyez sur la touche “Enter”. Une fois que vous avez appuyé sur Entrée, vous verrez une nouvelle colonne “Monthly-Total 2” qui affiche la somme des valeurs dans les colonnes “TotalCharges” et “MonthlyCharges”.

Vous pouvez voir que les requêtes DAX sont plus similaires à MS Excel.


Lequel de PostgreSQL ou de SQL Server est le plus simple à utiliser ? Comparez la facilité d'utilisation de PostgreSQL par rapport à MSSQL

  • PostgreSQL est un système avancé de gestion de base de données relationnelle objet qui utilise le langage de requête structuré (SQL) en plus de son propre langage procédural, PL/pgSQL. PostgreSQL est facile à utiliser avec une pile complète de fonctionnalités et de capacités de base de données SGBDR pour la gestion des données. Il peut être facilement installé sur des environnements Linux.
  • SQL Server est un système de gestion de base de données relationnelle (RDBM) développé et exploité par Microsoft. Il utilise une variante du langage de requête structuré (SQL) appelé T-SQL (pour Transact-SQL). Il peut fonctionner sur les systèmes d'exploitation Linux avec prise en charge de Kubernetes ou sur Windows. Les utilisateurs le décrivent comme facile à utiliser et fiable, avec une forte compatibilité .NET.

La fonction ci-dessous vous donne le mois en chiffres.

La fonction ci-dessous vous donne le nom du mois

La fonction ci-dessous vous donne un nom de mois court

Essayez d'utiliser celui-ci =TEXT([DateField]"mmmm") . J'ai généralement une erreur si j'utilise ',' au lieu de '' dans la formule. La langue de mon site est le russe et il se traduit ensuite automatiquement si j'écris d'abord en anglais.

Cela aiderait si vous partagiez votre formule. Essayer:

À des fins de tri (c'est-à-dire le tri croissant et le tri décroissant) le mois, je fais généralement ce qui suit :

Cela donne le format :

Ce qui vous permet ensuite de mettre en place une Vue où vous pouvez trier correctement par Mois.

Cela renverra un nombre de 1 à 12 et un Null lorsque la colonne de date est vide.

Le lien ci-dessus vers la solution pour se débarrasser des valeurs "02", "02" est rompu. cependant, j'ai posté une solution pour cela sur mon blog qui fonctionnera tout aussi bien : http://thesharepointhive.blogspot.com/2015/12/render-sharepoint-list-headers-in-order.html

Dernière date du mois (cela fonctionne aussi pour les années bissextiles)

J'ai sélectionné une date du 3 février 2018 dans une colonne de date de liste personnalisée (nommée « Date »), puis j'ai créé une colonne calculée avec cette formule :

La colonne calculée apparaît comme : sam 03 fév

Lorsque j'ai rencontré le même problème, J'ai modifié les paramètres régionaux du site en anglais, ajouté les formules de colonne calculées, puis rétabli les paramètres régionaux du site en allemand.

J'ai utilisé les formules de colonne calculées ci-dessous pour obtenir le format "MMMM-AAAA" ainsi que l'ordre de tri correct pour les mois (janvier, février, mars… etc.)

Mais plus tard, il a rencontré des problèmes lorsque des entrées de différentes années sont présentes. J'ai donc changé le format en "AAAA-MMMM" en utilisant les formules ci-dessous.


  1. Sélectionnez la liste dans la colonne A
  2. Cliquez avec le bouton droit et sélectionnez Nommer une plage.
  3. Entrez "ColonneVersRechercher"
  4. Cliquez sur la cellule C1
  5. Entrez cette formule : = MATCH(B1,ColumnToSearch,0)
  6. Faites glisser la formule vers le bas pour tous les éléments de B

Si la formule ne parvient pas à trouver une correspondance, elle sera marquée #N/A, sinon ce sera un nombre.

Si vous souhaitez qu'il soit VRAI pour la correspondance et FAUX pour l'absence de correspondance, utilisez plutôt cette formule :

Si vous souhaitez retourner le valeur introuvable et renvoie une chaîne vide pour les valeurs trouvées

Voici une méthode rapide et sale.

Mettre la colonne en surbrillance B et ouvrir Mise en forme conditionnelle.

Prendre Utilisez une formule pour déterminer les cellules à mettre en surbrillance.

Entrez la formule suivante, puis définissez votre format préféré.

Sélectionnez les deux colonnes. Accédez à Mise en forme conditionnelle et sélectionnez Mettre en évidence les règles de cellule. Sélectionnez Valeurs en double. Lorsque vous arrivez à l'étape suivante, vous pouvez le modifier en valeurs uniques. Je viens de le faire et ça a marché pour moi.

Il m'a fallu une éternité pour comprendre cela, mais c'est très simple. En supposant que les données commencent en A2 et B2 (pour les en-têtes), saisissez cette formule en C2 :

Une cellule avec #N/A signifie que la valeur juste à côté dans la colonne B n'apparaît nulle part dans toute la colonne A.

Veuillez noter que vous devez modifier $A$287 pour qu'il corresponde à l'ensemble de votre tableau de recherche dans la colonne A. Par exemple, si vos données dans la colonne A diminuent pour 1000 entrées, elles devraient être de $A$1000.

Voir ma réponse de formule matricielle à la liste A introuvable dans B ici :

Mes exigences n'étaient pas de mettre en évidence mais d'afficher toutes les valeurs, sauf celles qui sont des doublons sur 2 colonnes. J'ai pris l'aide de la solution de @brenton et je me suis encore amélioré pour afficher les valeurs afin que je puisse utiliser les données directement :

Copiez ceci dans la première cellule de la 3ème colonne et appliquez la formule dans toute la colonne afin qu'elle répertorie tous les éléments de la colonne B qui ne sont pas répertoriés dans la colonne A.

Merci à ceux qui ont partagé leurs réponses. Grâce à vos solutions, j'ai pu me frayer un chemin vers le mien.

Dans ma version de cette question, j'avais deux colonnes à comparer - une classe de finissants complète (Col A) et un sous-ensemble de cette classe de finissants (Col B). Je voulais pouvoir mettre en évidence dans la promotion complète les étudiants qui faisaient partie du sous-ensemble.

J'ai mis la formule suivante dans une troisième colonne:

Cela a codé la plupart de mes étudiants, même si cela a généré quelques erreurs dans les premières lignes de données.


SQL : chaîne vide vs valeur NULL

Je sais que ce sujet est un peu controversé et que de nombreux articles/opinions circulent sur Internet. Malheureusement, la plupart d'entre eux supposent que la personne ne sait pas quelle est la différence entre une chaîne NULL et une chaîne vide. Ils racontent donc des histoires sur des résultats surprenants avec des jointures/agrégats et font généralement des leçons SQL un peu plus avancées. En faisant cela, ils passent absolument à côté de l'essentiel et sont donc inutiles pour moi. J'espère donc que cette question et toutes les réponses feront avancer le sujet un peu.

Supposons que j'ai un tableau avec des informations personnelles (nom, naissance, etc.) où l'une des colonnes est une adresse e-mail de type varchar. Nous supposons que pour une raison quelconque, certaines personnes pourraient ne pas vouloir fournir d'adresse e-mail. Lors de l'insertion de telles données (sans e-mail) dans la table, deux choix sont disponibles : définir la cellule sur NULL ou la définir sur une chaîne vide (''). Supposons que je connaisse toutes les implications techniques du choix d'une solution plutôt qu'une autre et que je puisse créer des requêtes SQL correctes pour l'un ou l'autre scénario. Le problème est que même lorsque les deux valeurs diffèrent au niveau technique, elles sont exactement les mêmes au niveau logique. Après avoir regardé NULL et '' je suis arrivé à une seule conclusion: je ne connais pas l'adresse e-mail du gars. De plus, peu importe à quel point j'ai essayé, je n'ai pas pu envoyer d'e-mail en utilisant une chaîne NULL ou vide, donc apparemment, la plupart des serveurs SMTP sont d'accord avec ma logique. J'ai donc tendance à utiliser NULL où je ne connais pas la valeur et considère la chaîne vide comme une mauvaise chose.

Après d'intenses discussions avec des collègues, j'ai posé deux questions :

ai-je raison de supposer que l'utilisation d'une chaîne vide pour une valeur inconnue provoque le "mentir" d'une base de données sur les faits ? Pour être plus précis : en utilisant l'idée de SQL de ce qui est valeur et de ce qui ne l'est pas, je pourrais arriver à la conclusion : nous avons une adresse e-mail, juste en découvrant qu'elle n'est pas nulle. Mais plus tard, en essayant d'envoyer un e-mail, j'arriverai à une conclusion contradictoire : non, nous n'avons pas d'adresse e-mail, cette @!#$ Database doit avoir menti !

Existe-t-il un scénario logique dans lequel une chaîne vide '' pourrait être un si bon support d'informations importantes (en plus de la valeur et de l'absence de valeur), qui serait gênant/inefficace à stocker d'une autre manière (comme une colonne supplémentaire). J'ai vu de nombreux articles affirmant qu'il est parfois bon d'utiliser une chaîne vide avec des valeurs réelles et des valeurs NULL, mais jusqu'à présent, je n'ai pas vu de scénario qui serait logique (en termes de conception SQL/DB).


3 réponses 3

Vous pouvez écrire votre propre gestionnaire REST pour les requêtes personnalisées si vous le souhaitez. Dans votre cas, la requête peut être effectuée en procédant ainsi :

Il ne vous reste plus qu'à accéder à :

Utiliser le filtre rest__query pour ajouter la prise en charge de la méta de publication dans l'API WP Rest pour tout type de publication.

Obtenez les messages dont la valeur méta déjà visitée est true .

Il répertorie UNIQUEMENT les publications dont la clé méta déjà visitée a la valeur true .

Filtres disponibles

Le code suivant devrait ajouter plusieurs fonctionnalités de méta-requêtes à tous vos types de publication. Il prend en charge CPT (Custom Post Type) et ACF (Advanced Custom Field). Code source également disponible sur Github.

Ajoutez-le à votre fonction.php

À mon humble avis, une meilleure façon d'inclure la fonction supplémentaire en tant que plugin séparé. Ainsi, même lorsque l'utilisateur change de thème, vos appels API ne seront pas affectés.

C'est pourquoi j'ai développé un brancher pour la méta-requête dans WordPress. Mieux encore, il prend également en charge ACF !

Après l'installation, faites simplement un AVOIR demande dans le format suivant.


1) Entrez votre liste de valeurs fixes. (Ceux-ci doivent être dans la même feuille que la cellule que vous souhaitez restreindre)

2) Cliquez sur la cellule que vous souhaitez restreindre. Sélectionnez "validation" à partir d'Excel "Données" menu déroulant

3) Dans le menu déroulant sur le "Paramètres" sélection de l'onglet "Lister"

4) cliquez dans la case intitulée "La source" puis sélectionnez les cellules qui contiennent les valeurs définies à l'étape 1)

5) Cliquez sur OK et vous avez terminé.

Vous pouvez le faire pour n'importe quel nombre de cellules

Vous verrez une icône déroulante à côté de la ou des cellules restreintes. Cliquez dessus pour ne choisir que les valeurs de la liste. Excel n'autorisera aucune autre valeur dans cette cellule.

Regardez autour de vous dans la boîte de dialogue Validation et vous verrez que vous pouvez modifier son fonctionnement.

Plutôt que de sélectionner un groupe de cellules contenant les valeurs, vous pouvez écrire les valeurs sous forme de liste séparée par des points-virgules dans la zone source.

De plus, la restriction à l'étape 1 de la première réponse "(Celles-ci doivent être dans la même feuille que la cellule que vous souhaitez restreindre)" n'est pas vraie.

En fait, c'est une bonne pratique, surtout si vous utilisez un certain nombre de ces listes de recherche pour les mettre toutes dans un onglet Recherches, puis masquez l'onglet afin que les utilisateurs généraux ne puissent pas le voir et le manipuler.

Pour contourner la restriction mentionnée, vous devez configurer une plage nommée pour identifier la liste des éléments d'entrée autorisés. Étant donné que la plage nommée est reconnue dans tout le classeur, vous pouvez ensuite utiliser ce nom pour spécifier la liste dans tout autre onglet de votre choix. Dans la zone Source, tapez un signe = immédiatement suivi du nom que vous avez choisi pour la plage nommée