0
votes

Comment supprimer des dates en double si elles contiennent un champ NULL mais gardez toutes les autres dates en double

Je suis parti rejoint une table (tableau A) constitué entièrement de dates avec une table (tableau B) avec des dates + des données avec - afin de disposer d'une entrée pour chaque semaine de l'année. Je sais que les jointures laissées causeront des doublons - mais j'ai besoin d'un moyen de vous débarrasser des dates en double contenant un champ NULL, tout en gardant toutes les autres dates (même si elles sont duplicates.

ROW  Start of Week| Data  |
1 |  2018-07-01   | NULL  |
2 |  2018-07-01   | data  |
3 |  2018-09-01   | NULL  |
4 |  2018-10-03   | data  |
5 |  2018-10-03   | data  |
6 |  2018-10-03   | NULL  |
------------------------

sql

5 commentaires

Modifiez votre question et fournissez des exemples de données et la requête (peut-être simplifiée) que vous utilisez.


Les données sont-elles uniques ou peuvent également être dupliquées?


Quels RDBM utilisez-vous?


À quoi ressemble vos conditions de jointure? Si vous vous joignez juste au champ de date 1 ne devriez-vous pas jamais arriver ... ni 6 .... Sélectionnez A.MyDate, B.Data Gauche JOIN B sur A.MyDate = B.BDate et B .Data n'est pas NULL Ils ne se produisent pas, car une fois qu'une date a une donnée dans B, il ne peut pas être null ... Afficher les échantillons de données dans les deux tables, provoquant 2018-07-01 Null et Data .. .. de votre requête ...


Pourquoi avez-vous besoin de garder les deux rangées 4 et 5, ce sont des lignes en double, n'est-ce pas?


6 Réponses :


0
votes

Je vais faire un coup de poignard sans savoir quelle est votre requête ou vos données existantes. Ici, je prends l'hypothèse qu'il y a une FK à Tablea et que vous utilisez SQL Server. En outre, je n'utiliserais pas cela avec un ensemble de données relativement petit car distinct code> est assez intensif de ressource. Sinon, je chercherais une solution à l'aide de la fonction Row_Number ().

select distinct id, date, ISNULL(dataB, dataA) data
from (
  select a.id, a.date, null as dataA, null as dataB
  from tableA
  union
  select b.id, b.date, null as dataA, b.data as dataB
  from tableB b
  where data is not null
)


3 commentaires

Vous n'obtiendrez pas la rangée n ° 3 avec cette approche, n'est-ce pas?


Ce qui a laissé rejoindre Retourne le résultat régulier de la participation interne.


@Gsazheniuk vous avez raison. Je n'ai pas lu la question à fond.



1
votes

with non pas:

date       | datacol
01/07/2018 | data   
01/09/2018 | null
03/10/2018 | data   
03/10/2018 | data   


1 commentaires

MERCI! Aurait pu mieux formuler ma question et aurait dû fournir plus de code, mais cela a résolu mon problème!



0
votes

difficile à faire sans vos noms de colonne et tel, mais j'utiliserais où n'existe pas, j'ai intelligemment nommé votre identifiant de colonnes, TheDate et TheData: xxx SO: xxx


0 commentaires

0
votes

Ce SQL consiste à supprimer uniquement les enregistrements qui ont la valeur de TheData NULL et ont plusieurs enregistrements (compte> 1) lorsqu'ils sont regroupés par TheDate:

delete yourTable
where theData is null
and theDate in
(
select theDate
from yourTable
group by theDate
having count(*) > 1
)


1 commentaires

Veuillez fournir une explication à la réponse. Il fait également face à la suppression par @Tmstack.



2
votes

Je ne vois pas pourquoi vous obtenez des lignes 1 et 6 en premier lieu ...

Vous avez dit "Je sais que les jointures de gauche causeront des doublons" Pourquoi? Les seuls doublons qui devraient se produire sont ceux avec des dates correspondant au tableau B .. Tels que 20181003 dans votre exemple. Je ne vois pas pourquoi vous obtenez des lignes 1/6 dans la première place .. p>

(Utilisation de MySQL comme dB dans ce Exemple de réexter ) P>

SELECT * 
FROM (SELECT cast("20180701" as date) as MyDate union all
      SELECT cast("20180901" as date) union all
      SELECT cast("20181003" as date)) A
LEFT JOIN (
      SELECT cast("20180701" as date) as MyDate, 'data' dat union all
      SELECT cast("20181003" as date), 'data' dat union all
      SELECT cast("20181003" as date), 'data' dat) B
  on  A.MYDate = B.MyDate
 and B.Dat is not null  <-- so do this to solve the problem...


1 commentaires

Le tableau A était une "colonne vertébrale" composée de toutes semaines au cours d'une année donnée. Le tableau B a été une table composée de données qui se sont déroulées sur des semaines données, donc après avoir rejoint les deux, les dates du tableau B également dans le tableau A étaient également dupliquées, bien qu'une date avaient une donnée et l'autre ait été nulle (du tableau A). Je suis correct avec les données NULL pendant quelques semaines, s'il n'y a pas de match de Table B, cependant, s'ils partagent une date, je voudrais seulement voir la semaine avec les données et non la date avec les colonnes de données vides du tableau A.



1
votes

Voici le code SQL de travail:

ROW Start of WEEK           data    RowNo
2   2018-07-01 00:00:00.000 data1   1
3   2018-09-01 00:00:00.000 NULL    1
4   2018-10-03 00:00:00.000 data2   2
5   2018-10-03 00:00:00.000 data3   1


0 commentaires