Took me a minute... if you use Windowing functions (requires SQL 2012 or later), then this is easy. The PARTITION basically groups the records together... then you can use ROW_NUMBER() to number the members in each group, and then take the first one...
/* create the table -- since I'm grouping by the Date, I split EventDate and EventTime into separate columns */
CREATE TABLE #WeatherEvent (
EventDate DATE
,EventTime TIME
,Reading DECIMAL(3,1)
,ReadingID INT IDENTITY(1,1)
);
GO
/* insert some data... note the dates with multiple readings */
INSERT INTO #WeatherEvent (EventDate, EventTime, Reading)
VALUES ('11/19/2016', '10:10:26 PM',55),
('11/19/2016', '9:10:26 AM',65),
('11/20/2016', '1:21:26 AM', 54),
('11/20/2016', '4:45:22 PM', 72),
('11/21/2016', '1:02:27 AM', 49.9),
('11/22/2016', '08:00:26 AM', 50.3),
('11/22/2016', '4:45:32 PM', 90.3),
('11/23/2016', '10:25:26 AM', 43.8);
Read up on ROW_NUMBER() and windowing functions... Itzik Ben Gan's book is great if youre ready for it.
SELECT EventDate
, EventTime AS DailyHighTime
, Reading As DailyHigh
FROM (
SELECT EventDate
, EventTime
, Reading
, ROW_NUMBER() OVER (PARTITION BY EventDate ORDER BY Reading DESC) As ReadingID
FROM #WeatherEvent) we
WHERE we.ReadingID=1;