2016-10-23 8 views
0

Ich erstelle einen Bericht mit Qlikview und ich finde Schwierigkeiten beim Auffüllen einer bestimmten Tabelle.SQL/Qlikview, Rückgabe aller MAX-Werte

In dieser Tabelle tbl.scores möchte ich den neuesten Score-Wert für jeden Namen zurückgeben. auf der folgenden Tabelle

tbl_scores 
Name Date Score 
James 20160101 82 
Simon 20160505 66 
Peter 20160404 49 
John 20160303 91 
Sarah 20160820 68 
Joe 20160202 12 
James 20160921 43 
Simon 20160701 77 
Peter 20160319 75 
John 20160905 18 
Sarah 20160130 39 
Joe 20160604 25 

Was möchte ich haben möchte, ist

Name Score 
James 43 
Simon 77 
Peter 49 
John 18 
Sarah 68 
Joe 25 

Wo ich die MAX Datum für jeden Namen und gab die Partitur gefunden haben.

Im Moment habe ich es Name einer begrenzen hatte sonst nicht SQL

Scores nicht: SQL

SELECT   
Name, 
Score 
FROM  tbl_scores 
WHERE 
Name = 'James' 
AND 
Date = (SELECT MAX(Date) FROM tbl_scores WHERE Name = 'James'); 

Was würde ich die gewünschten Ergebnisse ändern müssen zu bekommen?

+0

dort Hallo, ich habe 890 Zeilen in der Tabelle und Spalten. Ich habe das Beispiel vereinfacht. 16 verschiedene "Namen" liefert die Abfrage 176 Zeilen statt 16 zurück. – KMoe

Antwort

1

können Sie verwenden ROW_NUMBER Fensterfunktion für alle gleich Name's

Select * from 
(
select row_number() over(partition by Name order by [Date] desc),* 
From tbl_scores 
)A 
Where Rn = 1 

Eine andere Art und Weise zu tun, mit TOP 1 with Ties

select TOP 1 with Ties * 
From tbl_scores 
Order by row_number() over(partition by Name order by [Date] desc) 

DEMO

CREATE TABLE tbl_scores 
    ([Name] varchar(5), [Date] datetime, [Score] int) 
; 

INSERT INTO tbl_scores 
    ([Name], [Date], [Score]) 
VALUES 
    ('James', '20160101', 82), 
    ('Simon', '20160505', 66), 
    ('Peter', '20160404', 49), 
    ('John', '20160303', 91), 
    ('Sarah', '20160820', 68), 
    ('Joe', '20160202', 12), 
    ('James', '20160921', 43), 
    ('Simon', '20160701', 77), 
    ('Peter', '20160319', 75), 
    ('John', '20160905', 18), 
    ('Sarah', '20160130', 39), 
    ('Joe', '20160604', 25) 
; 

Ergebnis:

+-------+-------------------------+-------+ 
| Name |   Date   | Score | 
+-------+-------------------------+-------+ 
| James | 2016-09-21 00:00:00.000 | 43 | 
| Joe | 2016-06-04 00:00:00.000 | 25 | 
| John | 2016-09-05 00:00:00.000 | 18 | 
| Peter | 2016-04-04 00:00:00.000 | 49 | 
| Sarah | 2016-08-20 00:00:00.000 | 68 | 
| Simon | 2016-07-01 00:00:00.000 | 77 | 
+-------+-------------------------+-------+ 
+0

Dies gibt das gewünschte Ergebnis zurück, hat aber wiederholte Zeilen. ZB James 43, James 43, so dass die Ergebnisse immer noch 12 Zeilen haben statt 6 Ich habe versucht, DISTINCT zu verwenden, aber das hat nicht funktioniert – KMoe

+0

@KMoe Das ist nicht möglich –

0

Joins Sie

SELECT t1.name,t1.score 
FROM tbl_scores t1 
INNER JOIN 
(
SELECT name,MAX([Date]) as RecentDate 
FROM tbl_scores 
GROUP BY name 
) t2 
ON t1.[Date] = t2.[RecentDate] 
0

diese wie tun können Sie auch äußere anwenden können:

SELECT f1.name,f3.* 
    FROM tbl_scores f1 
    outer apply 
    (
    SELECT top 1 f2.[Date], t1.score 
    FROM tbl_scores f2 
    where f1.Name=f2.name 
    order by f2.[Date] desc 
) t3 
Verwandte Themen