SQL-Abfrage

oraclin25

Erfahrenes Mitglied
Hallo zusammen,

wie kann ich alle Datensätze ausgeben lassen, wo an einer Spalte mindestens x-mal gleicher Eintrag drin steht. Also:

meineSpalte
----------------
1
1
1
1
1
2
2
3
3
3
4
4
5

Ich würde also gerne so etwas ausgeben lassen, da der jeweilige Eintrag mehr als x-mal(zum Beispiel 3 mal) auftaucht:

meineSpalte
----------------
1
1
1
1
1
3
3
3

Vielen lieben Dank zusammen.

Schöne Grüße aus Rheinland,

Eure Ratna:)
 
Hallo,

welches RDBMS? In Oracle (und anderswo) könnte man dazu analytische Funktionen verwenden:

Code:
with 
basedata as (
select 1 id from dual
union all
select 1 from dual
union all
select 1 from dual
union all
select 1 from dual
union all
select 1 from dual
union all
select 2 from dual
union all
select 2 from dual
union all
select 3 from dual
union all
select 3 from dual
union all
select 3 from dual
union all
select 4 from dual
union all
select 4 from dual
union all
select 5 from dual
)
,
basedata_with_analytics as (
select id
     , count(*) over(partition by id) col_count
  from basedata
)
select id
  from basedata_with_analytics
 where col_count >= 3;

        ID
----------
         1
         1
         1
         1
         1
         3
         3
         3

8 Zeilen ausgewählt.

Ohne Analytics müsste man einen self join mit einem gruppierten Ergebnis verwenden, was weniger elegant (und in der Regel langsamer) ist, aber grundsätzlich auch kein Problem:

Code:
with
basedata as (
select 1 id from dual
union all
select 1 from dual
union all
select 1 from dual
union all
select 1 from dual
union all
select 1 from dual
union all
select 2 from dual
union all
select 2 from dual
union all
select 3 from dual
union all
select 3 from dual
union all
select 3 from dual
union all
select 4 from dual
union all
select 4 from dual
union all
select 5 from dual
)
,
basedata_grouped as (
select id
     , count(*)
  from basedata
 group by id
having count(*) >= 3
)
select basedata.id
  from basedata
  join basedata_grouped
    on (basedata.id = basedata_grouped.id)
 ;

        ID
----------
         1
         1
         1
         1
         1
         3
         3
         3

8 Zeilen ausgewählt.

Beispiele hier jeweils für Oracle und mit CTE und connect by row Generierung, aber auch dazu gäbe es Alternativen.

Gruß

Martin
 
Hallo Martin,

vielen lieben Dank, hat funktioniert. Vielleicht eine weitere Frage hinterher:

ich habe eine Spalte wo integer zahlen drin stehen; alle allerdings 15-stellige zahlen. Bsp:

010120121000000
010120120000000
311220121000000

Man sieht, die ersten 6 Stellen sind eigentlich das Datum, danach kommt entweder ne 0 oder ne 1.

Meine Frage:
wie kann ich alle Datensätze ausgeben lassen, deren 7. Stelle eine eins ist? Ich habe über "like" gedacht:

where spalte like '%.1.%'

Aber irgendwie bin ich nicht auf die genaue Lösung gekommen. Vielen Dank.

Viele Grüße aus Rheinland,

Eure Ratna
 
Es steht immer noch die Frage im Raum welche Datenbank hier im Einsatz ist.

In MySQL würde es so aussehen:

SQL:
SELECT spalte FROM tabelle GROUP BY spalte HAVING COUNT(*) > 3

Oder zur Frage 2:

SQL:
SELECT
    spalte
FROM tabelle
WHERE
    SUBSTRING(spalte, 7, 1) = 1
OR
    SUBSTRING(spalte, 7, 1) = 0
 
Hallo Ratna,

theoretisch kann man das mit LIKE machen, aber lesbar ist das nicht. Dazu müsste man als Platzhalter einen Underscore verwenden, der für genau ein Zeichen steht, während % für kein, ein oder viele Zeichen steht. Das sähe mit Oracle etwa folgendermaßen aus:
Code:
with basedata as (
select '010120121000000' col1 from dual
union all
select '010120120000000' from dual
union all
select '311220121000000' from dual
)
select *
  from basedata
 where col1 like '________1%';

COL1
---------------
010120121000000
311220121000000

Geeigneter ist da sicher die von tombe vorgeschlagene Variante mit substring:

Code:
with basedata as (
select '010120121000000' col1 from dual
union all
select '010120120000000' from dual
union all
select '311220121000000' from dual
)
select *
  from basedata
 where substr(col1, 9, 1) = 1

COL1
---------------
010120121000000
311220121000000

Gruß

Martin
 
Oder Reguläre Ausdrücke

MySQL:
SQL:
WHERE col REGEXP '^.{6}1'

Oracle:
SQL:
WHERE REGEXP_LIKE(col, '^.{6}1')
 
Zuletzt bearbeitet von einem Moderator:
Hallo meine Herren,

also, viele Wege zum Ziel, sehr schön. Ich habs die (billigste) Variante mit dem Underscore genommen, es ****t.
Vielen Dank.

Ach ja, bei mir ist es DB2.

Viele Grüße aus Rheinland,

Eure Ratna
 

Neue Beiträge

Zurück