0
votes

SQL - Rejoignez deux tables, mais obtenez la moyenne de la colonne jointe uniquement par les occurrences de la table de gauche

Je souhaite rejoindre deux tables, mais obtenir la moyenne de la colonne jointe uniquement par les occurrences de la table gauche

document: p> xxx pré>

entité: p>

SELECT
  docT.name,
  AVG(docT.score),
  STRING_AGG(entityT.ename)
FROM
  document_sentiment docT
JOIN
  entity_sentiment entityT
ON
  docT.dId = entityT.dId
GROUP BY
  docT.cname


8 commentaires

J'ai supprimé la balise SQL Server, car c'est clairement MySQL; SQL Server n'utilise pas de backticks ( `) pour les caractères de devis. S'il vous plaît seulement marquer les RDBM que vous utilisez lors de l'utilisation des balises. Merci.


Vous n'avez pas de connexion à Google Bigquery pour tester et vérifier. Mais quelque chose comme avg (distinct doct.score) fonctionne dessus?


Vérifiez SQLFIDDLE.COM/#!9/708B25/21


Et s'il y a un même score pour différent? Non, vous ne pouvez pas utiliser AVG (distinct ...) ici!


Joli! Je ne sais pas que c'est ce dont vous avez vraiment besoin, mais bon à savoir.


@MIKHAILBERGY DROITE.


@Lukstorms distincts ne fonctionnera pas car il peut y avoir un score de double pour différent


Je suis d'accord, ce n'est pas la solution.


4 Réponses :


1
votes

Essayez le code ci-dessous

select name, ename, avg(score) as score
from (SELECT
  docT.name,
  doct.Did,
  MAX(docT.score) as score,
  STRING_AGG(entityT.ename) as ename
FROM
  document_sentiment docT
JOIN
  entity_sentiment entityT
ON
  docT.dId = entityT.dId
GROUP BY
  docT.cname, doct.Did
) sub
group by name, ename


0 commentaires

1
votes

Essayez ceci xxx

SQL Fiddle


0 commentaires

1
votes

ci-dessous est pour BigQuery Standard SQL

#standardSQL
WITH `project.dataset.document_sentiment` AS (
  SELECT 'A' dId, 'n1' name, 100 score UNION ALL
  SELECT 'B', 'n1', 70 
), `project.dataset.entity_sentiment` AS (
  SELECT 'e1' ename, 'a' details, 'A' dId UNION ALL
  SELECT 'e2', 'a', 'A' UNION ALL
  SELECT 'e3', 'b', 'A' UNION ALL
  SELECT 'e4', 'c', 'B' 
)
SELECT
  docT.name,
  AVG(docT.score) average,
  STRING_AGG(entityT.ename) entities
FROM `project.dataset.document_sentiment` docT
JOIN (
  SELECT dId, STRING_AGG(ename) ename
  FROM `project.dataset.entity_sentiment`
  GROUP BY dId
) entityT
ON docT.dId = entityT.dId
GROUP BY docT.name  

Row name    average     entities     
1   n1      85.0        e1,e2,e3,e4  


0 commentaires

0
votes

C'est délicat. Je pense que les fonctions de fenêtre peuvent être la solution la plus simple: xxx

pourquoi est-ce délicat? Eh bien, si vous regroupez par CNAME , vous perdez et ne peut pas faire le rejoindre .

La pré-agrégation ne fait pas l'affaire. Heureusement, cela est résolu à l'aide de fonctions de fenêtre.


0 commentaires