Sql 查询以将多行与多个日期匹配

Sql 查询以将多行与多个日期匹配,sql,Sql,我有一张桌子:- SKU DATE VALUE ABC 2 Aug 10 100 ABC 15 Aug 10 150 ABC 20 Aug 10 180 DEF 2 Aug 10 130 GHI 3 Aug 10 120 JKL 2 Aug 10 140 JKL 20 Aug 10 160 我希望它是:- SKU DATE VALUE ABC

我有一张桌子:-

SKU      DATE        VALUE
ABC      2 Aug 10    100
ABC      15 Aug 10   150
ABC      20 Aug 10   180
DEF      2 Aug 10    130
GHI      3 Aug 10    120
JKL      2 Aug 10    140
JKL      20 Aug 10   160
我希望它是:-

SKU      DATE        VALUE
ABC      20 Aug 10   180
DEF      2 Aug 10    130
GHI      3 Aug 10    120
JKL      20 Aug 10   160
简而言之,根据最早的日期删除具有多个日期的SKU。只有一个日期的,保留


谢谢。

替代特定DBMS的通用解决方案

SELECT *
FROM yourTable T1
WHERE NOT EXISTS (
  SELECT *
  FROM yourTable T2
  WHERE T2.SKU = T1.SKU
  AND T2.DATE > T1.DATE
)
此外,如果您碰巧使用的是MySQL或SQL Server(2008年测试),那么您可以使用以下简单方法:

DELETE  t1
FROM    your_tb t1
JOIN    your_tb t2 ON (t2.sku = t1.sku AND t2.date > t1.date);
测试用例:

CREATE TABLE your_tb (sku char(3), date date, value int);

INSERT INTO your_tb VALUES ('ABC', '2010-08-02', 100);
INSERT INTO your_tb VALUES ('ABC', '2010-08-15', 150);
INSERT INTO your_tb VALUES ('ABC', '2010-08-20', 180);
INSERT INTO your_tb VALUES ('DEF', '2010-08-02', 130);
INSERT INTO your_tb VALUES ('GHI', '2010-08-03', 120);
INSERT INTO your_tb VALUES ('JKL', '2010-08-02', 140);
INSERT INTO your_tb VALUES ('JKL', '2010-08-20', 160);
应用删除后的结果:

SELECT * FROM your_tb;
+------+------------+-------+
| sku  | date       | value |
+------+------------+-------+
| ABC  | 2010-08-20 |   180 |
| DEF  | 2010-08-02 |   130 |
| GHI  | 2010-08-03 |   120 |
| JKL  | 2010-08-20 |   160 |
+------+------------+-------+
4 rows in set (0.00 sec)

如果有多个行具有相同的sku和相同的日期,该怎么办?您要选择哪一个

(我没有看到对你的问题发表评论的链接,因此作为答案回答)


在某些数据库中,您可以使用分析函数进行此操作:

Select sku, date, value from (
    select t.*,
        row_number() over (partition by sku order by date) row
    from t1    
) where row = 1
警告:可能包含打字错误


这应该适用于oracle,也可能适用于sql server。

您使用的是什么DBMS?请注意,这会为您提供您想要保留的记录。将“不存在”更改为“存在”,以获取要删除的记录。
Select sku, date, value from (
    select t.*,
        row_number() over (partition by sku order by date) row
    from t1    
) where row = 1