Heim  >  Artikel  >  Datenbank  >  Detaillierte Erklärung des Unterschieds zwischen „distinct', „row_number()' und „over()'

Detaillierte Erklärung des Unterschieds zwischen „distinct', „row_number()' und „over()'

Y2J
Y2JOriginal
2017-05-24 13:55:121587Durchsuche

In diesem Artikel werden hauptsächlich die Unterschiede und Verwendungsinformationen zwischen „Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over()“ und „row_number() over()“ in SQL vorgestellt. Freunde, die es benötigen, können darauf verweisen

1 Vorwort

Wenn wir SQL-Anweisungen schreiben, um Daten in der Datenbank zu verarbeiten, können einige unangenehme Probleme auftreten. Beispielsweise müssen wir für Datensätze mit demselben Namen im selben Feld nur einen anzeigen, tatsächlich kann die Datenbank jedoch mehrere enthalten Datensätze mit demselben Namen, sodass beim Abrufen mehrere Datensätze angezeigt werden, was unserer ursprünglichen Absicht widerspricht! Um diese Situation zu vermeiden, müssen wir daher eine Verarbeitung zur „EntfeDetaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over()ung von Duplikaten“ durchführen. Was ist also „EntfeDetaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over()ung von Duplikaten“? Vereinfacht ausgedrückt bedeutet dies, dass für Datensätze mit demselben Inhalt im selben Feld nur ein Datensatz angezeigt wird.

Wie implementiert man also die Funktion „DuplikatentfeDetaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over()ung“? In dieser Hinsicht haben wir zwei Möglichkeiten, diese Funktion zu erreichen.

Fügen Sie beim ersten Mal das Schlüsselwort „Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over()“ hinzu.

Beim zweiten rufen Sie beim Schreiben der select-Anweisung die Funktion row_number() over() auf 🎜>.

Beide der beiden oben genannten Methoden können die Funktion „DuplikatentfeDetaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over()ung“ erreichen. Was sind also die Gemeinsamkeiten und Unterschiede zwischen den beiden? Als nächstes gibt der Autor detaillierte Anweisungen.

2 unique

In SQL wird das Schlüsselwort „Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over()“ verwendet, um eindeutig unterschiedliche Werte zurückzugeben. Das Syntaxformat ist:


SELECT DISTINCT 列名称 FROM 表名称
Angenommen, es gibt eine Tabelle „Detaillierte Erklärung des Unterschieds zwischen „Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over(), „row_number() und „over()“, die zwei Felder enthält: NAME und AGE. Das spezifische Format ist wie folgt:

Detaillierte Erklärung des Unterschieds zwischen „Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over(), „row_number() und „over()

Wenn wir die obige Tabelle betrachten, werden wir feststellen, dass es zwei Datensätze mit demselben NAMEN und drei Datensätze mit demselben ALTER gibt. Wenn wir die folgende SQL-Anweisung ausführen, erhält


/**
* 其中 PPPRDER 为 Schema 的名字,即表 Detaillierte Erklärung des Unterschieds zwischen „Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over(), „row_number() und „over() 在 PPPRDER 中
*/

select Detaillierte Erklärung des Unterschieds zwischen „Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over(), „row_number() und „over() from PPPRDER.Detaillierte Erklärung des Unterschieds zwischen „Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over(), „row_number() und „over()
die folgenden Ergebnisse:

Detaillierte Erklärung des Unterschieds zwischen „Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over(), „row_number() und „over()

Observe this As Als Ergebnis werden wir feststellen, dass die oben genannten vier Datensätze zwei Datensätze mit demselben NAME-Wert enthalten, dh die Werte des 2. Datensatzes und des 3. Datensatzes sind beide „gavin“. Was ist also, wenn nur ein Datensatz mit demselben Namen angezeigt werden soll? Zu diesem Zeitpunkt müssen Sie das Schlüsselwort „Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over()“ verwenden! Führen Sie als Nächstes die folgende SQL-Anweisung aus:


select Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over() Detaillierte Erklärung des Unterschieds zwischen „Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over(), „row_number() und „over() from PPPRDER.Detaillierte Erklärung des Unterschieds zwischen „Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over(), „row_number() und „over()
und Sie erhalten das folgende Ergebnis:

Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over()

Observe Das Ergebnis: Offensichtlich wurde unser Wunsch verwirklicht! Wir müssen uns jedoch fragen: Welchen Effekt hat es, wenn das Schlüsselwort „Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over()“ gleichzeitig auf zwei Felder angewendet wird? Nachdem wir darüber nachgedacht haben, versuchen wir es und führen die folgende SQL-Anweisung aus:


select Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over() Detaillierte Erklärung des Unterschieds zwischen „Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over(), „row_number() und „over(), age from PPPRDER.Detaillierte Erklärung des Unterschieds zwischen „Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over(), „row_number() und „over()
Das Ergebnis ist wie folgt:

Detaillierte Erklärung des Unterschieds zwischen „Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over(), „row_number() und „over()andage

Beobachten Sie das Ergebnis, ups, es scheint keine Wirkung zu haben? Sie hat alle Datensätze angezeigt! Es gibt zwei Datensätze mit demselben NAME-Wert und drei Datensätze mit demselben AGE-Wert. Es gibt überhaupt keine Änderung! Aber tatsächlich sollte das Ergebnis so sein. Denn

Wenn „Distinct“ auf mehrere Felder angewendet wird, „dedupliziert“ sie nur Datensätze mit den gleichen Feldwerten Offensichtlich erfüllen unsere „schlechten“ vier Datensätze diese Bedingung nicht, daher werden Sie denken, dass die oben genannten vier Datensätze sind nicht gleich. Das ist leeres Gerede. Als nächstes fügen wir der Tabelle „Detaillierte Erklärung des Unterschieds zwischen „Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over(), „row_number() und „over()“ einen identischen Datensatz hinzu und überprüfen ihn. Die Tabelle sieht nach dem Hinzufügen eines Datensatzes wie folgt aus:

Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over()

Führen Sie die folgende SQL-Anweisung eDetaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over()eut aus:


select Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over() Detaillierte Erklärung des Unterschieds zwischen „Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over(), „row_number() und „over(), age from PPPRDER.Detaillierte Erklärung des Unterschieds zwischen „Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over(), „row_number() und „over()
Die erhaltenen Ergebnisse sind wie folgt:

Detaillierte Erklärung des Unterschieds zwischen „Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over(), „row_number() und „over()andage

Die Beobachtung dieses Ergebnisses bestätigt unsere obige Schlussfolgerung perfekt.

Darüber hinaus gibt es eine Sache, auf die jeder besonders achten muss:

Das Schlüsselwort „Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over()“ kann nur funktionieren, wenn es vor allen FeldeDetaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over() in der SQL-Anweisung „If“ steht Wird es an der falschen Position platziert, meldet SQL keinen Fehler, hat aber keine Auswirkung.

3 row_number() over()

In der SQL Server-Datenbank steht uns eine Funktion row_number() für die row_number() in zur Verfügung Datenbanktabelle. Bei Verwendung folgt eine Funktion over(), und die Funktion von over() besteht darin, die Datensätze in der Tabelle zu

zu gruppieren . Die von beiden verwendete Syntax lautet:


ROW_NUMBER() OVER(PARTITION BY COLUMN1 ORDER BY COLUMN2)
, was bedeutet: Gruppieren Sie die Datensätze in der Tabelle nach Feld COLUMN1 und sortieren Sie nach Feld COLUMN2, wobei

PARTITION BY: Gibt die Gruppierung an. ORDER BY: Zeigt die Sortierung an

接下来,咱们还用表“Detaillierte Erklärung des Unterschieds zwischen „Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over(), „row_number() und „over()”中的数据进行测试。首先,给出没有使用 row_number() over() Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over()时查询的结果,如下所示:

Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over()

然后,运行如下 SQL 语句,


select PPPRDER.Detaillierte Erklärung des Unterschieds zwischen „Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over(), „row_number() und „over().*, row_number() over(partition by age order by Detaillierte Erklärung des Unterschieds zwischen „Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over(), „row_number() und „over() desc) from PPPRDER.Detaillierte Erklärung des Unterschieds zwischen „Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over(), „row_number() und „over()

得到的结果如下所示:

Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over()

从上面的结果可以看出,其在原表的基础上,多了一列标有数字排序的列。那么反过来分析咱们运行的 SQL 语句,发现其确实按字段 AGE 的值进行分组了,也按字段 NAME 的值进行排序啦!因此,Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over()的功能得到了验证。

接下来,咱们就研究如何用 row_number() over() Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over()实现“去重”的功能。通过观察上面的结果,咱们可以发现,如果以 NAME 分组,以 AGE 排序,然后再取每组的第一个记录或许就可以实现“去重”的功能啊!那么试试看,运行如下 SQL 语句,


/*
* 其中 Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over() 表示最后添加的那一列
*/

select * from 
(select PPPRDER.Detaillierte Erklärung des Unterschieds zwischen „Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over(), „row_number() und „over().*, row_number() over(partition by Detaillierte Erklärung des Unterschieds zwischen „Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over(), „row_number() und „over() order by age desc) Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over() from PPPRDER.Detaillierte Erklärung des Unterschieds zwischen „Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over(), „row_number() und „over())
where Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over() = 1

运行后,得到的结果如下所示:

Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over()

观察以上的结果,我们发现,哎呀,数据“去重”的功能一不小心就被咱们实现了啊!不过很遗憾,如果咱们细心的话,会发现一个很不爽的事情,那就是在执行以上 SQL 语句进行“去重”的时候,有一条 NAME 值为“gavin”、AGE 值为“18”的记录被过滤掉了,但是在现实生活会中,同名不同年龄的事情太正常了。

4 总结

通过阅读及实践以上内容,咱们已经知道了,无论是用关键字 Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over() 还是用Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over() row_number() over() 都可以实现数据“去重”的功能。但是在实现使用的过程中,咱们要特别注意两者的用法特点以及区别。

在使用关键字 Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over() 的时候,咱们要知道其作用于单个字段和多个字段的时候是有区别的,作用于单个字段时,其“去重”的是表中所有该字段值重复的数据;作用于多个字段的时候,其“去重”的表中所有字段(即 Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over() 具体作用的多个字段)值都相同的数据。

使用Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over() row_number() over() 的时候,其是按先分组排序后,再取出每组的第一条记录来进行“去重”的(在本篇博文中如此)。当然,在此处咱们还可以通过不同的限制条件来进行“去重”,具体如何实现,就需要大家自己去动脑思考啦!

最后,在本篇博文中,作者详述了自己对用关键字 Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over() 和Detaillierte Erklärung des Unterschieds zwischen „distinct, „row_number() und „over() row_number() over() 进行数据“去重”的一些认识,希望以上的内容能够对大家有所帮助!

【相关推荐】

1. Mysql免费视频教程

2. 详解innodb_index_stats导入数据时 提示表主键冲突的错误

3. 实例详解 mysql中innodb_autoinc_lock_mode

4. MySQL中添加新用户权限的实例详解

5. 实例详解mysql中init_connect方法

Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung des Unterschieds zwischen „distinct', „row_number()' und „over()'. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn