2017-02-14 13 views
3

Ich habe eine Tabelle mit Datum, Wert und Benutzer. Diese Tabelle enthält mehrere Zeilen für dasselbe Datum, aber einen anderen Benutzer und Wert.SQL - Wählen Sie den doppelten Wert

Ich möchte verschiedene datetime mit dem entsprechenden Wert und Benutzer auswählen. Wenn es eine doppelte Datetime mit verschiedenen Benutzern gibt, sollte der Wert, den user2 eingegeben hat, priorisiert werden.

 
Table 1 
----------------- 
DateTime| Value| User 
--------|---------|--------- 
1/1/17 |  10| User1 
2/1/17 |  30| User1 
3/1/17 |  10| User1 
1/1/17 |  90| User2 
2/1/17 |  80| User2  

So von oben, würde ich mit

 
1/1/17 |  90| User2 
2/1/17 |  80| User2 
3/1/17 |  10| User1 

am Ende ich bin sicher, dass es zu dieser eine einfache Antwort ist, aber ich kann für das Leben von mir nicht herausfinden, wie zu tun es!

Jede Hilfe sehr geschätzt.

Danke

+0

Wie haben u gt 80 für Datum 2/1/17? –

+0

Sorry Tippfehler, soll 90 sein. Wird aktualisiert. –

Antwort

2

Nicht ganz einfach! Mit Fensterfunktionen und allgemeine Tabellenausdrücke

; with x as (
select [DateTime], value, [User], row_num = row_number() over(partition by [DateTime] order by [User] desc) from Table1 
) 
select x.* from x where row_num = 1 
+0

Dies nutzt die Tatsache, dass 'Benutzer2'> 'Benutzer1', in einer allgemeineren Einstellung die Reihenfolge nach Klausel wäre anders gewesen. –

0
DECLARE @T as table 
(
    [DateTime] nvarchar(100), 
    VALUE INT, 
    [USER] VARCHAR(32) 
) 

INSERT INTO @T 
VALUES 
('1/1/17', 10, 'User1'), 
('2/1/17', 30, 'User1'), 
('3/1/17', 10, 'User1'), 
('1/1/17', 90, 'User2'), 
('2/1/17', 80, 'User2') 

SELECT t.[DateTime], t.VALUE, t.[USER] 
FROM @T t 
    JOIN (
     SELECT [DateTime], MAX([USER]) AS [USER] 
     FROM @T 
     GROUP BY [DateTime] 
    ) u ON u.[DateTime] = t.[DateTime] AND u.[USER] = t.[USER] 
ORDER BY VALUE DESC 
0
;with cte 
as 
(
select 
*, 
row_number() over (partition by date order by replace(user,'user','') desc) as rownum 
from 
#temp 
) 
select * from cte where rownum=1 
2

Dies wird die Eingabe von 'User2', auch immer Vorrang, wenn der Eingang dort aus 'User1' und 'User3' ist.

;with cte as (
    select * 
    , rn = row_number() over (
     partition by [DateTime] 
     order by (case when [user] = 'User2' then 0 else 1 end) asc 
    ) 
    from t 
) 
select * 
from cte 
where rn=1 

rextester http://rextester.com/AZVA85684

Ergebnisse:

+----------+-------+-------+----+ 
| DateTime | value | user | rn | 
+----------+-------+-------+----+ 
| 1/1/17 | 90 | User2 | 1 | 
| 2/1/17 | 80 | User2 | 1 | 
| 3/1/17 | 10 | User1 | 1 | 
+----------+-------+-------+----+