一尘不染

选择指定年份的新商品或退货商品

sql

我有一张大致如下所示的表格:

+---------------------+----------+
| date                | item     |
+---------------------+----------+
| 2008-11-30 11:15:59 | Plums    |
| 2012-11-08 19:42:37 | Lemons   |
| 2013-01-30 18:58:07 | Apples   |
| 2013-02-12 13:44:45 | Pears    |
| 2014-06-08 11:46:48 | Apples   |
| 2014-09-01 20:28:03 | Oranges  |
+---------------------+----------+

我现在想为两种情况选择项目:

1)我想选择今年(或指定的不同年份)的所有不同项目,这些项目今年都是新的,这意味着它们在前几年没有出现。因此,该查询应将2014年的结果显示为“橙色”。

2)我还想选择本(或另一个指定的)年中所有属于RETURNING的项目,这显然意味着它们已出现在前几年中。该查询应给我“苹果”作为2014年的结果。

为了明确起见,我只想将这两个查询用于与前几年的比较。因此,如果我将2013指定为运行该查询的年份,则“ Apples”应显示为新的,而不是返回。

我不一定要在一个查询中同时使用这两种方法(我怀疑是否有可能),因此两个不同的查询(每种情况一个)非常好。


阅读 142

收藏
2021-05-16

共1个答案

一尘不染

新* 项目的( SQL Fiddle )如何: *

SELECT DISTINCT m1.item
FROM MyTable m1
  LEFT JOIN MyTable m2 ON m1.item = m2.item AND YEAR(m2.date) < 2014
WHERE YEAR(m1.date) = 2014
  AND m2.date IS NULL

和( SQL小提琴 )为 RETURNING 项目:

SELECT DISTINCT m1.item
FROM MyTable m1
  INNER JOIN MyTable m2 ON m1.item = m2.item
WHERE YEAR(m1.date) = 2014
  AND YEAR(m2.date) < 2014

如果要将两个查询组合在一起( SQL Fiddle SQL
Fiddle
):

SELECT DISTINCT m1.item, 'New' AS Status
FROM MyTable m1
  LEFT JOIN MyTable m2 ON m1.item = m2.item AND YEAR(m2.date) < 2014
WHERE YEAR(m1.date) = 2014
  AND m2.date IS NULL
UNION ALL
SELECT DISTINCT m1.item, 'Returning' AS Status
FROM MyTable m1
  INNER JOIN MyTable m2 ON m1.item = m2.item
WHERE YEAR(m1.date) = 2014
  AND YEAR(m2.date) < 2014
ORDER BY Status;
2021-05-16