2017-11-22 3 views
-1

Ich suche nach der Möglichkeit, Zeilen mit Top-N-Werten in bestimmten Feld zu wählen. Zum Beispiel möchte ich Zeilen für das letzte und das zweitletzte Datum in der Tabelle auswählen. Also könnte ich das verwenden:Wählen Sie TOP N Werte in WHERE

SELECT F1, F2, F3, report_date FROM My_Table 
WHERE report_date = (SELECT MAX(report_date) from My_Table) 
OR report_date = (
SELECT MAX(report_date from My_Table 
WHERE report_date < (SELECT MAX(report_date) FROM My_Table) 
) 

Ok, es funktioniert wie erwartet. Aber für, sagen wir, Top 5 Daten wäre der Code sehr anspruchsvoll. Ich habe so etwas versucht:

Select * from AL_CHECKER 
where REPORT_DATE in (
select top 2 MAX(REPORT_DATE) from AL_CHECKER order by max(report_date) desc 
) 

Aber ich habe gerade erfahren, dass TOP N nicht in Unterabfrage unterstützt wird. Was wird also unterstützt und wie ist es so einfach wie möglich zu lesen?

+1

Haben Sie darüber nachgedacht, mit [QUALIFY mit ROW_NUMBER] (https://info.teradata.com/htmlpubs/DB_TTU_16_00/index.html#page/SQL_Reference/B035-1146-160K/hlo1472240810308.html)? – LukStorms

+0

Sie könnten row_number() über (Partition by ... order by) und dann auf top 5 beschränken. – Ramesh

Antwort

0

Gordon Abfrage mit DENSE_RANK statt ROW_NUMBER funktioniert wie erwartet.

In Bezug auf die Top N Option wird nicht unterstützt in Unterabfrage Fehler, gibt es eine Problemumgehung. Darin heißt es ausdrücklich Subquery (weil es korreliert könnte), erwähnt aber nicht Derived Tables, so dass die Unterabfrage in einer abgeleiteten Tabelle geschachtelt werden:

SELECT * 
FROM AL_CHECKER 
WHERE report_date IN 
(
    SELECT * 
    FROM 
    (
     SELECT TOP 2 report_date 
     FROM AL_CHECKER 
     GROUP BY 1 
     ORDER BY 1 
    ) AS dt 
) 
2

würden Sie Fensterfunktionen verwenden und eine Unterabfrage oder qualify in Teradata:

select t.* 
from my_table t 
qualify row_number() over (order by date desc) <= 5; 

Wenn Sie Verbindungen schließen wollten, würden Sie entweder rank() oder dense_rank() verwenden.

Oder können Sie einfach top verwenden:

select top 5 t.* 
from my_table t 
order by date desc; 
+0

Aber ich brauche keine Top 5 Zeilen, sondern Zeilen mit Top 5 Werten in bestimmten Spalten. – MarcinSzaleniec

0

Gordon Abfrage ist nur, dass ... es wird Ihnen Reihen mit den „Top-5“ (das heißt maximal) Datumswerte.

Wenn Sie auf andere Werte in einer anderen Spalte basiert bestellen möchten, nur die ORDER BY-Feld ändern und die sort_order (ASC/DESC)