开发者

SQL How to remove duplicates within select query?

开发者 https://www.devze.com 2023-01-15 15:49 出处:网络
I 开发者_StackOverflowhave a table which looks like that: As You see, there are some date duplicates, so how to select only one row for each date in that table?

I 开发者_StackOverflowhave a table which looks like that:

SQL How to remove duplicates within select query?

As You see, there are some date duplicates, so how to select only one row for each date in that table?

the column 'id_from_other_table' is from INNER JOIN with the table above


There are multiple rows with the same date, but the time is different. Therefore, DISTINCT start_date will not work. What you need is: cast the start_date to a DATE (so the TIME part is gone), and then do a DISTINCT:

SELECT DISTINCT CAST(start_date AS DATE) FROM table;

Depending on what database you use, the type name for DATE is different.


Do you need any other information except the date? If not:

SELECT DISTINCT start_date FROM table;


You mention that there are date duplicates, but it appears they're quite unique down to the precision of seconds.

Can you clarify what precision of date you start considering dates duplicate - day, hour, minute?

In any case, you'll probably want to floor your datetime field. You didn't indicate which field is preferred when removing duplicates, so this query will prefer the last name in alphabetical order.

 SELECT MAX(owner_name), 
        --floored to the second
        dateadd(second,datediff(second,'2000-01-01',start_date),'2000-01-01') AS StartDate
 From   MyTable
 GROUP BY dateadd(second,datediff(second,'2000-01-01',start_date),'2000-01-01')


Select Distinct CAST(FLOOR( CAST(start_date AS FLOAT ) )AS DATETIME) from Table


If you want to select any random single row for particular day, then

SELECT * FROM table_name GROUP BY DAY(start_date)

If you want to select single entry for each user per day, then

SELECT * FROM table_name GROUP BY DAY(start_date),owner_name


here is the solution for your query returning only one row for each date in that table here in the solution 'tony' will occur twice as two different start dates are there for it

SELECT * FROM 
(
    SELECT T1.*, ROW_NUMBER() OVER(PARTITION BY TRUNC(START_DATE),OWNER_NAME ORDER BY 1,2 DESC )  RNM
    FROM TABLE T1
)
WHERE RNM=1


You have to convert the "DateTime" to a "Date". Then you can easier select just one for the given date no matter the time for that date.

0

精彩评论

暂无评论...
验证码 换一张
取 消