Hogyan lehet SQL adattáblából eltávolítani azokat a sorokat ahol az első oszlopban eggyezés van?
A | B | C
alma|körte|szilva
körte|szilva|alma
alma|narancs|banán
Ebből a harmadik sornak kellene eltűnnie az alma miatt.
Eredetileg többezer sor van. Sz kellene hogy a teljes első oszlopot nézze a parancs.
- Nem írtad, hogy milyen SQL-nyelvjárásban kell a megoldás
- Van a táblán valami egyedi rekordazonosító (ID)?
- Az SQL halmazorientált, ami azt jelenti, hogy ha nem mondod meg neki külön, akkor véletlenszerű lesz, hogy az első avagy a harmadik alma-rekord törlődik. A későbbi rekordot szeretnéd törölni?
Igazából lehet átfogalmaznám a kérdést.
Excelben van minden adat.
Amit szeretnék, hogy A oszlop alapján csak az egyedi sorok maradjanak meg.
Ha A oszlopban akármennyi duplikátum van akkor az összes teljes sor törlődjön
Tehát az itt említett példából csak a körtés sor maradjon.
A végső formátum ami kell nekem az egy txt.
Hogy lehet ezt a legegyszerűbben megoldani?
Így azért kicsit más a leányzó fekvése. ;)
- Ha a duplikátokból az első előfordulást meg lehetne hagyni, akkor a 'Data' menű 'Remove Duplicates'-a megoldaná a dolgot elegánsan magában az Excelben is.
Itt egy angol link is hozzá egyéb alternatívákkal is kiegészítve:
- Ha muszáj Excel-ben megoldani, akkor VBA kódot kellhet írni szerintem, szimplán csak összekattingatni mintha nem lehetne. De tévedhetek és az utánam hozzászólók ebben kijavíthatnak.
- Ha kijjebb nézünk az Excelből, akkor itt egy angol és egy magyar link miket lehet csinálni:
- Én valszeg Sqlite-ot vetnék be txt import+exporttal, ha tényleg nem lenne elég önmagában az Excel.
Az alábbival megszűrtem a duplikátumokat az első oszlop alapján.
--------------------------------------------------------
Sub remove_duplicates_by_first_column()
'
' remove_duplicates_by_first_column Makró
'
'
Range("$A:$J").CurrentRegion.RemoveDuplicates Columns:=1, Header:=xlYes
End Sub
--------------------------------------------------------
Így viszont még mindig megmaradt a duplikátumokból az eredeti.
Amit tudnék már egyszerűen szűrni mert ezeknél a megmaradt soroknál a B cellában van szöveg.
Tehát most már csak egy olyan script kellene hogy ha a B cella nem üres akkor törölje az sort.
ezt találtam viszont kellene egy kis móosítás
-------------------------------------------------------
Sub Delete_Rows_Based_On_Value()
'Apply a filter to a Range and delete visible rows
'Source: [link]
Dim ws As Worksheet
'1. Apply Filter
Range("A1:J1398").AutoFilter Field:=2, Criteria1:=""
'2. Delete Rows
Application.DisplayAlerts = False
Range("A2:J100000").SpecialCells(xlCellTypeVisible).Delete
Application.DisplayAlerts = True
'3. Clear Filter
On Error Resume Next
Range("A1:J100000").AutoFilter.ShowAllData
On Error GoTo 0
End Sub
------------------------------------------------------
Ebben annyi a baj, hogy ez az üreseket törli.
Mit kell beírnom, hogy ha azt akarom hogy a nem üreseket törölje?
A másik baj, hogy az kellene, hogy a teljes oszlopot figyelje és ne kelljen manuálisan megadni neki a J oszlopban az elemek számát.
mondjuk egy olyan jól jönne hogy J oszlop all, vagy J oszlop utolsó eleme. nem tudom van e erre valami képlet.
- Elfelejtettem délelött mondani prog.hu-n könnyebben, gyorsabban kapsz választ ilyen VBA-s kérdésekre. :)
- Illetve még azt, hogy ez tipikusan pl.: Pythonos feladat, ha már programozni kell: könnyedén mehet be és ki a textfile, méretlimit is kevésbé van, feldolgozási sebesség is korrektebb, magasszintű adat- és programozási struktúrák is vannak, stb. :)
- Mivel Excelben akarod megoldani a feladatot, így megnéztem még egy körben van-e kattintós megoldás. És van :)
- A fenti cikk a megoldás alapja.
- Kell egy 'Home'/'Conditional Formatting' range-re (neked első oszlop) 'Duplicate Values'. Ha interaktívan töltesz fel oszlopot, akkor is azonnal szineződik az új érték, ha volt már korábban.
- Ezek után már csak szét kell választani a színes és nem színes első oszlopú rekordokat.
- Ráállsz valamelyik fehér (single value-s) oszlopú rekordra, jobb egérgomb, 'Filter'/Filter by Selected Cell's Color
- Az összes rekordot kijelölöd átmásolod más sheetre, majd save as text.
Hát ha valamire, akkor erre a Python jó, de te tudod, semmiről nem akarlak lebeszélni:
Itt egy példa a Python nagyszerűségére
Egyszer kell csak végigolvasni az egész input textfile-t (ennél nincs jobb performancia) az alábbi egyetlen magasszintű paranccsal és csak az 1-nek megfelelőket írod ki.
PS: A df az DataFrame, egy tábla tulajdonképpen, rekordokkal, mezővel.
df.groupby(['col1', 'col2']).size()
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!