首页 > 解决方案 > 选择中的最小日期标志

问题描述

我有一张包含产品销售记录的表格。出于销售计数的目的,一件产品只能计数一次。在这种情况下,产品被多次销售和撤销,我们应该只考虑它在最小日期的月份中,其余的所有日期都应该标记为否。

示例:

Product Month   Sales flag
A       Jan-01  Y
B       Jan-01  Y
A       Feb-01  N
C       Feb-01  Y

我怎样才能从上面指示的表中写一个选择。任何帮助,将不胜感激。

尝试并失败。

标签: tsql

解决方案


这里的技巧是按“Jan-01”、“Feb-01”等排序是很棘手的,因为您需要对存储为文本的数值进行排序。这是日历表或数据维度的用途之一。在下面的解决方案中,我正在创建一个带有“月数”的即时日期维度表,您可以按...

-- Sample data
DECLARE @table TABLE 
(
  Product   CHAR(1) NOT NULL,
  Mo        CHAR(6) NOT NULL
)
INSERT @table VALUES
('A', 'Jan-01'),
('B', 'Jan-01'),
('A', 'Feb-01'),
('C', 'Feb-01');

-- Solution
SELECT f.Product, f.Mo, [Sales Flag] = CASE f.rnk WHEN 1 THEN 'Y' ELSE 'N' END
FROM
(
  SELECT t.Product, i.Mo, rnk = ROW_NUMBER() OVER (PARTITION BY t.Product ORDER BY i.RN)
  FROM   @table AS t
  JOIN
  (
    SELECT i.RN, Mo = LEFT(DATENAME(MONTH,DATEADD(MONTH, i.RN-1, '20010101')),3)+'-01'
    FROM 
    (
      SELECT RN = ROW_NUMBER() OVER (ORDER BY (SELECT 1))
      FROM   (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) AS x(x)
    ) AS i
  ) AS i ON t.Mo = i.Mo
) AS f;

回报:

Product Mo     Sales Flag
------- ------ ----------
A       Jan-01 Y
A       Feb-01 N
B       Jan-01 Y
C       Feb-01 Y

推荐阅读