it-swarm.com.de

Suchen von Zeilen mit derselben ID, aber unterschiedlichem Datum

Betrachten Sie die folgende Tabelle tbl:

id    date
1     2016
1     2017
2     2017
2     2017
3     2016
3     2017
4     2018
5     2018

Wie kann ich nur Zeilen mit derselben ID, aber unterschiedlichem Datum erhalten?.

Im Moment kann ich nur IDs mit mehr als 1 Anzahl erhalten, wie folgt:

select id, date
from tbl
group by id
having count(id)>1

Wie kann ich nur ID 1 und 3 zusammen mit Datum erhalten?

1
MYGz

Verwenden Sie eine AGGREGATE -Funktion wie MIN oder MAX.

Wenn Sie nur einen Datensatz pro ID möchten, müssen Sie das gewünschte Datum auswählen. Der erste (MIN) oder der neueste (MAX).

https://docs.Microsoft.com/en-us/sql/t-sql/functions/aggregate-functions-transact-sql?view=sql-server-2017

^^ Die obigen Informationen entsprechen nicht den Anforderungen.

Bearbeitet gemäß Klarstellung in Kommentaren: Verwenden Sie einfach das HAVING, um zu identifizieren, welche ID-Werte mehr als ein Datum haben, und wenden Sie dieses dann auf ein neues SELECT an.

SELECT id, Date
FROM tbl
WHERE id IN
    (
        select id 
        from tbl
        group by id
        having count(distinct date)>1
    )
6
MguerraTorres

Noch ein paar Möglichkeiten, um das gleiche Ergebnis zu erzielen:

Verwenden Sie zunächst min(date) < max(date) als HAVING -Bedingung - anstelle von count(distinct date) > 1. Vielleicht etwas effizienter:

select id, date
from tbl
where id in 
      ( select id
        from tbl
        group by id
        having min(date) < max(date)
      ) ;

oder mit einem JOIN:

select t.id, t.date
from tbl as t
     join 
      ( select id
        from tbl
        group by id
        having min(date) < max(date)
      ) as g
      on g.id = t.id ;

und man konvertiert die IN in eine korrelierte EXISTS Unterabfrage. Bonus, wir können den GROUP BY Entfernen:

select id, date
from tbl as t
where exists
      ( select 1
        from tbl as t2
        where t.id = t2.id
          and t.date <> t2.date
      ) ;

Eine andere, die Fensterfunktionen verwendet:

select id, date
from
  ( select id, date,
           diff_dates = case when min(date) over (partition by id)
                                < max(date) over (partition by id)
                             then 1
                        end 
    from tbl
  ) as d
where diff_dates = 1 ;

und zuletzt eine für den Verschleierungswettbewerb:

select id, date from tbl
except
select id, min(date) from tbl group by id
intersect
select id, max(date) from tbl group by id ;

Test in dbfiffle.

5
ypercubeᵀᴹ

Sie sollten wie Sie zählen und pro Datum unterschiedlich zählen

SELECT T.id,T.date
FROM Table1 AS T
CROSS APPLY
  (SELECT C.id 
          ,Count(id) as count_id
          ,Count(Distinct date) as count_Distinct_Records
      FROM Table1 AS C
      WHERE C.id = T.id
      GROUP BY id) AS CA
WHERE
  CA.count_id > 1
  AND count_Distinct_Records > 1

ausgabe hier:

id  date
1   2016
1   2017
3   2016
3   2017

dbfiddle

2
Sabin Bio