【问题标题】:Ignoring Duplicate Records SQL忽略重复记录 SQL
【发布时间】:2018-04-26 06:32:54
【问题描述】:

需要帮助:)

所以我有一个包含以下列的记录表:

Key (PK, FK, int) DT (smalldatetime) Value (real)

DT 是一天中每半小时的日期时间,并带有相关值

例如

Key       DT                       VALUE
1000      2010-01-01 08:00:00      80
1000      2010-01-01 08:30:00      75
1000      2010-01-01 09:00:00      100

我有一个查询,它每 24 小时及其相关时间查找最大值,但是,在某一天,最大值出现两次,因此重复了导致处理问题的日期。我尝试使用行号(),但我不能在 where 子句中使用计算列? 目前我有:

SELECT       cast(T1.DT as date) as 'Date',Cast(T1.DT as time(0)) as 'HH', ROW_NUMBER() over (PARTITION BY  cast(DT as date) ORDER BY DT) AS 'RowNumber'
FROM        TABLE_1 AS T1
INNER JOIN  (
                SELECT CAST([DT] as date) as 'DATE'
                ,       MAX([VALUE]) as 'MAX_HH'
                FROM    TABLE_1
                WHERE   DT > '6-nov-2016' and [KEY] = '1000'
                GROUP BY CAST([DT] as date)
            ) AS MAX_DT
        ON  MAX_DT.[DATE] = CAST(T1.[DT] as date)
        AND T1.VALUE = MAX_DT.MAX_HH
WHERE       DT > '6-nov-2016' and [KEY] = '1000'
ORDER BY DT

这会导致

Key       DT               VALUE       HH
1000      2010-01-01       80          07:00:00
1000      2010-02-01       100         17:30:00
1000      2010-02-01       100         18:00:00

我需要删除重复的日期(我没有偏好它需要哪个 HH)

我想我已经解释得很糟糕了,如果没有意义,请告诉我,我会尝试重新编写

有什么想法吗?

【问题讨论】:

  • 用 row_number() 我想要么是 oracle 要么是 sqlserver
  • SQL SERVER - 我的道歉

标签: sql tsql datetime duplicates window-functions


【解决方案1】:

你可以试试这个新代码在**中:

 SELECT       cast(T1.DT as date) as 'Date', ** MIN(Cast(T1.DT as time(0))) as 'HH' **
    FROM        TABLE_1 AS T1
    INNER JOIN  (
                    SELECT CAST([DT] as date) as 'DATE'
                    ,       MAX([VALUE]) as 'MAX_HH'
                FROM    TABLE_1
                WHERE   DT > '6-nov-2016' and [KEY] = '1000'
                GROUP BY CAST([DT] as date)
            ) AS MAX_DT
        ON  MAX_DT.[DATE] = CAST(T1.[DT] as date)
        AND T1.VALUE = MAX_DT.MAX_HH
WHERE       DT > '6-nov-2016' and [KEY] = '1000'

这里放组

GROUP BY cast(T1.DT as date)
ORDER BY DT

【讨论】:

  • 不幸的是没有返回记录:(
  • 完美!!非常感谢您的帮助。
【解决方案2】:

我会做这样的事情 我没试过,但我认为它是正确的。

SELECT  cast(T1.DT as date) as 'Date',Cast(T1.DT as time(0)) as 'HH', VALUE 
FROM TABLE_1 T1      
       WHERE [DT] IN (       
       --select the max date from Table_1 for each day
            SELECT MAX([DT]) max_date FROM TABLE_1
            WHERE (CAST([DT] as date) ,value) IN 
            (
             SELECT CAST([DT] as date) as 'CAST_DATE'
              ,MAX([VALUE]) as 'MAX_HH'
              FROM    TABLE_1
              WHERE   DT > '6-nov-2016' and [KEY] = '1000'
             GROUP BY CAST([DT] as date
            )group by [DT]
           )
 WHERE       DT > '6-nov-2016' and [KEY] = '1000'

【讨论】:

    【解决方案3】:

    JOIN 更改为APPLY

    APPLY 操作将允许您将连接关系限制为每个源关系的一个结果。

    SELECT v.[Key], cast(v.DT As Date) as "Date", v.[Value], cast(v.DT as Time(0)) as "HH"
    FROM
    (   -- First a projection to get just the exact dates you want
        SELECT DISTINCT [Key], CAST(DT as DATE) as DT 
        FROM Table_1 
        WHERE [Key] = '1000' AMD DT > '20161106'
    ) dates
    CROSS APPLY (
        -- Then use APPLY rather than JOIN to find just the exact one record you need for each date
        SELECT TOP 1 * 
        FROM Table_1 
        WHERE [Key] = dates.[Key] AND cast(DT as DATE) = dates.DT ORDER BY [Value] DESC
    ) v
    

    最后一点:此查询和问题中的示例查询都将包含 2016 年 11 月 6 日的值。查询说 > 2016-11-05 具有排他性不等式,但原始查询仍在使用完整的 DateTime 值进行比较,这意味着存在是一个隐含的 0 作为时间分量。因此,11 月 6 日的 12:01 AM 仍然大于 11 月 6 日的 12:00:00.001 AM。如果要从查询中排除所有 11 月 6 日的日期,则需要将其更改为在日期结束时使用时间值,或者投射到日期之前进行>比较。

    【讨论】:

      【解决方案4】:

      使用 SQL 你可以使用SELECT DISTINCT

      SELECT DISTINCT 语句用于仅返回不同(不同)的值。

      在一个表中,一列通常包含许多重复值;有时您只想列出不同的(不同的)值。

      SELECT DISTINCT 语句用于仅返回不同(不同)的值。

      【讨论】:

      • 这不是问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-17
      • 1970-01-01
      • 2021-04-17
      • 2019-08-08
      • 2017-08-01
      • 2020-05-19
      • 1970-01-01
      相关资源
      最近更新 更多