There would be many ways to approach this task. For example you could use derived table to find out the most recent update then limit the displayed records to only records matching that derived table:
SELECT main.S_No, main.St, main.DateOfUpdate
FROM _myTable AS main
INNER JOIN (
SELECT S_No, MAX(DateOfUpdate) AS RecentDateOfUpdate
GROUP BY S_No
) AS recentUpdates ON main.S_No = recentUpdates.S_No AND main.DateOfUpdate = recentUpdates.RecentDateOfUpdate
ORDER BY main.S_No
Note, I'm using only group by S_No column as in the sample result it seemed that the St column had no meaning for grouping, but only was returned as a result for particular row. The result of derived table "recentUpdates" which returns only recent date for given S_No column, is used then to limit number of rows returned from table. Join could be replaced with WHERE EXIST, if you prefer.
Also instead of GROUP you could enumerate rows in particular order and then display the one you're interested. For example you could use ROW_NUMBER() function as in below example:
SELECT S_No, St, DateOfUpdate
SELECT S_No, St, DateOfUpdate, RowPriority = ROW_NUMBER() OVER (PARTITION BY S_No ORDER BY DateOfUpdate DESC)
) AS main
WHERE RowPriority = 1
ORDER BY S_No
Few words about above example: The PARTITION BY S_No would start enumerating rows from the beginning for every unique S_No value. Ordering rows in descending order would then ensure that most recent date is always enumerated as 1.
I hope these examples will help.