【问题标题】:Need to pick duplicates based on current date需要根据当前日期选择重复项
【发布时间】:2023-03-15 17:31:01
【问题描述】:

我有样本数据

Name    Product Prd_cnt Prd_dt
BSA     CYCLE   20      29-01-2019
BSA     CYCLE   20      28-01-2019
BSA     CYCLE   20      27-01-2019
BSA     CYCLE   20      26-01-2019
BSA     CYCLE   40      25-01-2019
BSA     CYCLE   35      24-01-2019
BSA     CYCLE   35      23-01-2019
BSA     CYCLE   35      22-01-2019

即使日期不同,我也需要选择过去 4 天计数相同的记录。从当前日期到过去 4 天。如果其中一条记录与过去 4 天不同。不需要那些记录。

输出:

Name  Product   Prd_cnt   Prd_dt
BSA   CYCLE     20        29-01-2019
BSA   CYCLE     20        28-01-2019
BSA   CYCLE     20        27-01-2019
BSA   CYCLE     20        26-01-2019

我尝试过使用ROW_NUMBERCOUNT()

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    您只需使用BETWEENDATEADD() 即可查找最近4 天的结果:

    SELECT * FROM YourTable
    WHERE PRD_DT BETWEEN CAST(DATEADD(DAY,-3,GETDATE()) AS DATE) 
                    AND  CAST(GETDATE() AS DATE)
    

    【讨论】:

      【解决方案2】:

      我会简单地使用exists

      首先,创建并填充示例表(在您以后的问题中保存我们这一步):

      CREATE TABLE T(
        Name   VARCHAR(50),
        Product VARCHAR(50),
        Prd_cnt INT,
        Prd_dt  DATE
      );
      
      INSERT INTO T (Name, Product, Prd_cnt, Prd_dt) VALUES 
      ('BSA','CYCLE',20,'2019-01-29'),
      ('BSA','CYCLE',20,'2019-01-28'),
      ('BSA','CYCLE',20,'2019-01-27'),
      ('BSA','CYCLE',20,'2019-01-26'),
      ('BSA','CYCLE',40,'2019-01-25'),
      ('BSA','CYCLE',35,'2019-01-24'),
      ('BSA','CYCLE',35,'2019-01-23'),
      ('BSA','CYCLE',35,'2019-01-22'),
      ('BSA','CYCLE',40,'2019-01-21');
      

      然后,一个简单的公用表表达式和一个存在子查询:

      WITH CTE AS
      (
          SELECT Name,Product,Prd_cnt,Prd_dt
          FROM T As t0
          WHERE Prd_dt <= GETDATE()
          AND Prd_dt >= CAST(DATEADD(DAY, -3, GETDATE()) As Date)
      )
      SELECT Name,Product,Prd_cnt,Prd_dt
      FROM CTE As t0
      WHERE EXISTS
      (
          SELECT 1
          FROM CTE As t1
          WHERE t0.Prd_dt <> t1.Prd_dt
          AND t0.Prd_cnt = t1.Prd_cnt
      )
      

      公用表表达式选择过去四天的所有记录,exists 仅过滤具有重复 Prd_cnt 值的记录。
      请注意,如果您希望副本也考虑其他列,您所要做的就是将它们添加到存在子查询 where 子句中。

      感谢 D-Shih 为 DDL+DML 示例数据创建小提琴。

      【讨论】:

      • 让我在我的代码中实现这个并回复你
      • 很高兴为您提供帮助 :-)
      【解决方案3】:

      你可以试试这个

      SELECT distinct Orders.*
      FROM (
          SELECT Name, Product, Prd_cnt, ROW_NUMBER ()   
          OVER (PARTITION BY Name, Product, Prd_cnt order by Prd_dt)  as RN 
          FROM Orders 
      )t 
      inner join Orders on t.Name = Orders.Name and t.Prd_cnt = Orders.Prd_cnt
      and t.Product = Orders.Product where RN >= 4 AND Orders.Prd_dt < GetDate()
      

      【讨论】:

        【解决方案4】:

        试试下面的查询:

        select * from myTable t1
        where Prd_dt > cast(dateadd(day, -4, getdate()) as date)
        and exists(select 1 from myTable
                   where Prd_dt > cast(dateadd(day, -4, getdate()) as date)
                   and product = t1.product
                   group by product
                   having count(*) > 1)
        

        如果对于特定的Product 有两个以上的记录,子查询将返回行,这反过来会产生所有行,其中 Product 值在过去四天内重复。

        【讨论】:

          【解决方案5】:

          你可以试试这个

          SELECT * FROM T WHERE Prd_cnt=(SELECT Prd_cnt FROM T HAVING COUNT(Prd_cnt)>1) and 
          DATEDIFF(CURRENT_TIMESTAMP,(
          SELECT Prd_dt FROM T WHERE DATEDIFF(CURRENT_TIMESTAMP,Prd_dt)<4 ORDER BY Prd_dt LIMIT 1));
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-08-22
            • 2014-11-02
            • 2019-08-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-08
            相关资源
            最近更新 更多