2017-02-21 4 views
0

in einem Microsoft SQL Server, haben wir diese Tabelle, die Eigenschaftsänderungen der Benutzer anmeldet:SQL: Finden Datum Spiel außerhalb oder innerhalb eines Bereichs

ID | userID | prop | changeDate 
------------------------------- 
4 23  B  2017-02-18 
1 14  D  2013-05-19 
2 15  C  2014-04-10 
3 23  A  2016-01-11 

Was ich möchte, ist zu tun in dieser Tabelle abzufragen und finden die aktive Eigenschaft innerhalb einer Reihe von Daten.

Zum Beispiel der Zeit des 2016-08-01-2017-01-01 würde Ich mag userID 23 mit Stütze bekommen A da, dass die aktive Eigenschaft für diesen Benutzer war, bis er auf 2017-02-18

Ich begann mit den changeDate BETWEEN '2016-08-01' and '2017-01-01' aber, dass nur Abdeckungen geändert wurde die Fälle, in denen ich das genaue Startdatum habe.

Ich bin leicht verrückt geworden. Ist diese Suche mit diesen Daten überhaupt möglich? Oder stelle ich vielleicht die falsche Frage?

+2

Ich glaube, Sie fragen die falsche Frage suchen. Was möchten Sie zurückgeben, wenn der Benutzer während des Zeitraums mehrere Eigenschaften besitzt? –

+0

Das ist ein guter Punkt, Gordon. Ich habe diesen Teil vereinfacht. – teni

Antwort

1

Selbst beitreten kann hier helfen.

CREATE TABLE x (ID INT, userID INT, prop CHAR(1), changeDate DATETIME) 

INSERT INTO x 
    VALUES (4, 23, 'B', '20170218'), 
     (1, 14, 'D', '20130519'), 
     (2, 15, 'C', '20140410'), 
     (3, 23, 'A', '20160111') 

; WITH cte AS (
    SELECT x1.userID, x1.prop, x1.changeDate AS StartDate, MIN(x2.changeDate) AS ExitDate 
    FROM x x1 
      LEFT OUTER JOIN x x2 
        ON x1.changeDate < x2.changeDate 
    GROUP BY x1.userID, x1.prop, x1.changeDate 
) 

SELECT * 
FROM cte 
WHERE Startdate > = '20160801' 
    AND (ExitDate IS NULL OR ExitDate < '20170101') 

Dies gibt Ihnen, was Sie für

userID | prop | StartDate    | ExitDate 
-------------------------------------------------- 
23  B  2017-02-18 00:00:00.000 NULL  
+0

Ausgezeichnet. Dies ist perfekt! Ich danke dir sehr! Ich würde gruppieren von changeDate, userID, prop. Aber ansonsten machte das meinen Abend wirklich :) – teni

2

Bei einer Tabelle dieses Typs lautet die typische Frage "Was war eine gegebene Benutzereigenschaft als eines bestimmten Datums?"

Diese beantwortet diese Frage:

select pc.* 
from (select pc.*, 
      row_number() over (partition by userId order by changeDate desc) as seqnum 
     from propertychanges pc 
     where changeDate <= @AsOfDate 
    ) pc 
where seqnum = 1; 
+0

Danke, dass Sie sowohl eine Frage als auch eine Antwort vorgeschlagen haben;) Ich war eine Zeit lang ziemlich verloren. In diesem Fall ist jedoch der Datumsbereich entscheidend. Die typische Frage passt also nicht ganz. – teni

Verwandte Themen