Krijg de meest recente record van de dag voor een gebruiker in SQL

Hoe de laatste record van de dag voor een gebruiker te krijgen als er meerdere items van dezelfde gebruiker in een tabel van hetzelfde per dag zijn.

Bijvoorbeeld:

Id      UserName               CreatedOn
1       B               2018-11-20
2       A               2018-12-20
3       A               2018-11-19
4       B               2018-11-18

Ik wil resultaat voor gebruiker A, B zoals:

Id      UserName               CreatedOn
2       A               2018-12-20
1       B               2018-11-20
0
Meer voorbeeldgegevens zijn vereist; uw huidige resultaat kon worden verkregen uit uw gegevens eenvoudig met behulp van selecteer * uit tabel waar gebruikersnaam = 'A'
toegevoegd de auteur Lee Mac, de bron
Waarom wordt ID 4 niet geretourneerd? Aangezien u geen tijdwaarde hebt, wat definieert dat een rij "meer" recent is, heeft ID een hogere waarde? (Overweeg dat de waarde van ID groter wordt naarmate u verder gaat, zou impliceren dat hoe lager het getal, hoe recenter.)
toegevoegd de auteur Larnu, de bron
Je laatste bewerking verwart alleen dingen meer. U geeft "Hoe u De laatste record van de dag van de gebruiker krijgt als er meerdere gebruikersinvoer van dezelfde gebruiker in de tabel per dag is" . Dus, op basis van uw gegevens, moet elke rij in uw voorbeeldgegevens worden geretourneerd. Dit zijn alle "meest recente" rijen voor die dag, omdat geen enkele gebruiker meerdere vermeldingen op de dezelfde dag heeft.
toegevoegd de auteur Larnu, de bron
@Larnu, wat ik begrepen heb, is dat, nu het aantal dagen telt, hij alleen het laatste record van de dag/dagen wil.
toegevoegd de auteur affanBajwa, de bron
ik ben nu op zoek naar Gebruiker A.
toegevoegd de auteur Shailendra Pal, de bron
kan iemand mijn update-eis controleren?
toegevoegd de auteur Shailendra Pal, de bron

7 antwoord

Create Table #tbl
(
Id Int,
UserName VarChar(25),
CreatedOn Date
)

Insert Into #tbl Values
(1,'B','2018-11-20'),
(2,'A','2018-12-20'),
(3,'A','2018-11-19'),
(4,'B','2018-11-18')


Select Username, Max(CreatedOn) As LastDT from #tbl
Group By UserName

Resultaat:

Username    LastDT
A           2018-12-20
B           2018-11-20

UPDATE: dit werkt als je per dag groepeert: een jaarselectie gebruiken met [DateTime]

Create Table #tbl
(
Id Int,
UserName VarChar(25),
CreatedOn DateTime
)

Insert Into #tbl Values
(1,'B','2018-11-20 10:45:12.000'),
(2,'A','2018-12-20 07:45:12.000'),
(3,'A','2018-11-19 09:45:12.000'),
(4,'B','2018-11-18 11:45:12.000'),
(5,'B','2018-11-20 01:50:12.000')

 Select  Username, Max(CreatedOn) As LastDT from #tbl
Where DatePart(year,CreatedOn) = '2018'
Group By UserName, DatePart(dayofyear ,CreatedOn)
Order By UserName

Resultaat overdag:

Username    LastDT
A           2018-11-19 09:45:12.000
A           2018-12-20 07:45:12.000
B           2018-11-18 11:45:12.000
B           2018-11-20 10:45:12.000
2
toegevoegd
Ik geloof dat het de nieuwste record aller tijden zal geven, wat hij nodig heeft is het laatste record van elke dag.
toegevoegd de auteur affanBajwa, de bron
@affanBajwa, ik heb een update uitgevoerd om te kunnen groeperen overdag. De voorbeeldgegevens stonden dit niet toe, daarom heb ik een veld DateTime opgegeven om te demonstreren.
toegevoegd de auteur level3looper, de bron

Ik denk dat je gewoon het nieuwste record per gebruiker wilt

select  *
from    (
            select  *, rn = row_number() over (partition by UserName order by CreatedOn desc)
            from    yourtable
        ) d
where   d.rn = 1
order by CreatedOn desc
0
toegevoegd

U kunt dense_rank gebruiken zoals in de volgende SQL-instructie

  select Id, UserName, CreatedOn
    from
    (
    select *,
           dense_rank() over ( partition by username order by CreatedOn desc) as
           max_CreatedOn 
      from t 
    ) q
   where max_CreatedOn = 1;

Rextester-demo

0
toegevoegd

Door de functie WITH TIES in deSQL-serverte gebruiken

SELECT TOP 2 WITH TIES UserName,CreatedOn  
FROM #tbl
ORDER BY ( ROW_NUMBER()OVER(PARTITION BY UserName ORDER BY CreatedOn DESC ))

Resultaat

UserName    CreatedOn
-----------------------
  A         2018-12-20
  B         2018-11-20
0
toegevoegd

Als u wilt dat het resultaat van A alleen records betekent, de onderstaande query

SELECT * FROM myTable WHERE UserName = 'A' ORDER BY CreatedOn DESC

Als u een bepaald aantal A rijen wilt,

SELECT top 2 * FROM myTable WHERE UserName = 'A' ORDER BY CreatedOn DESC
0
toegevoegd

Als u de nieuwste record voor elke gebruiker wilt, dan zou het moeten werken:

SELECT UserName, MAX(CreatedOn) FROM yourTable GROUP BY UserName

Het zal de laatste invoer voor elke gebruiker retourneren

Output:

UserName       CreatedOn
    A          2018-12-20
    B          2018-11-20
0
toegevoegd
Maar de OP verwacht 2 rijen, niet 1.
toegevoegd de auteur Larnu, de bron
Uitgegeven na OP-verduidelijkingen.
toegevoegd de auteur Noob dev, de bron

U kunt de volgende eenvoudige vraag uitproberen met behulp van het sleutelwoord TOP

Create Table #temp
(
Id Int,
UserName VarChar(25),
CreatedOn Date
)

Insert Into #temp Values
(1,'B','2018-11-20'),
(2,'A','2018-12-20'),
(3,'A','2018-11-19'),
(4,'B','2018-11-18')

Select TOP 2 * from #temp ORDER BY CreatedOn DESC

De uitvoer is zoals hieronder getoond

Id  UserName    CreatedOn
-------------------------
2   A          2018-12-20
1   B          2018-11-20
0
toegevoegd