sql - 需要根据当前日期选择重复项

标签 sql sql-server tsql

我有样本数据

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_NUMBER并拥有 COUNT() .

最佳答案

我会简单地使用 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 示例数据创建了一个 fiddle 。

关于sql - 需要根据当前日期选择重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54417688/

相关文章:

sql - 如何从最接近table1的DATE FIELD的table2中提取数据?

mysql - 基于日期的动态表名

mysql - 如何修复mysql中的 "right syntax to use near ' as begin“错误?

mysql - 使用 MYSQL 而不是 MSSQL 的跨表连接

sql-server - Ubuntu 中的 RODBC 将文本字符串截断为 255 个字符

sql server 2008 对 exec 语句的限制

sql-server - MERGE 查询和删除记录

sql - 仅选择那些只出现一次的行

mysql - 将单个文本列拆分为所有可能组合的两列

sql - 声明的变量的行为与硬编码字符串不同