Sql server 请帮助修改这个简单但丑陋的查询

Sql server 请帮助修改这个简单但丑陋的查询,sql-server,Sql Server,我已经问过了,但看起来很难看。主要的问题是,我担心性能会很慢 这是我的桌子: ID ProductCode Qty PYear PMonth 1 A1 4 2015 2 2 A2 5 2015 2 3 A3 2 2014

我已经问过了,但看起来很难看。主要的问题是,我担心性能会很慢

这是我的桌子:

ID      ProductCode         Qty        PYear      PMonth
1            A1              4          2015        2
2            A2              5          2015        2  
3            A3              2          2014       12
4            A3             16          2015        4
我想获得每个产品的最新销售日期类别,下面是我想要的结果:

ProductCode         Qty         Year      Month
     A1              4          2015        2
     A2              5          2015        2  
     A3             16          2015        4
看起来很简单,但我的查询很复杂,我打赌一定有一个简单的解决方案,下面是我正在处理的查询,我将年份和月份合并到一列中:

SELECT A.ProductCode, B.Qty, PDate 
FROM (
    SELECT MAX(ID) AS purchaseID, 
    ProductCode, 
    MAX(CAST(PYear AS VARCHAR(4)) + '-' + CAST(PMonthAS VARCHAR(2)) + '-1') AS PDate
    FROM Table1
    GROUP BY ProductCode
) AS B
LEFT JOIN Table1 AS B ON A.ID= B.ID

使用窗口函数应该可以做到这一点——这将根据降序日期为每条记录提供一行,并按productcode分组

SELECT 
purchaseID
,ProductCode
,Qty
,Pdate
FROM
( 
SELECT 
purchaseID 
,Qty
,ProductCode 
,CAST(PYear AS VARCHAR(4)) + '-' + CAST(PMonthAS VARCHAR(2)) + '-1') AS PDate
,ROW_NUMBER() OVER (PARTITION BY ProductCode ORDER BY CAST(PYear AS VARCHAR(4)) + '-' + CAST(PMonthAS VARCHAR(2)) + '-1') DESC) AS ROWNO
FROM Table1 
)
WHERE ROWNO = 1

使用窗口函数应该可以做到这一点——这将根据降序日期为每条记录提供一行,并按productcode分组

SELECT 
purchaseID
,ProductCode
,Qty
,Pdate
FROM
( 
SELECT 
purchaseID 
,Qty
,ProductCode 
,CAST(PYear AS VARCHAR(4)) + '-' + CAST(PMonthAS VARCHAR(2)) + '-1') AS PDate
,ROW_NUMBER() OVER (PARTITION BY ProductCode ORDER BY CAST(PYear AS VARCHAR(4)) + '-' + CAST(PMonthAS VARCHAR(2)) + '-1') DESC) AS ROWNO
FROM Table1 
)
WHERE ROWNO = 1

您可以将
行号
与CTE一起使用?在这种情况下,您实际上不需要使用
JOIN

;WITH CTE AS (
  SELECT *, ROW_NUMBER() OVER(PARTITION BY PRODUCTCODE ORDER BY PYEAR DESC, PMONTH DESC) AS RN
  FROM TABLE1)
 SELECT PRODUCTCODE, QTY, PYEAR, PMONTH
 FROM CTE
 WHERE RN = 1

这里有一个SQL提琴:

您可以将
行数
与CTE一起使用吗?在这种情况下,您实际上不需要使用
JOIN

;WITH CTE AS (
  SELECT *, ROW_NUMBER() OVER(PARTITION BY PRODUCTCODE ORDER BY PYEAR DESC, PMONTH DESC) AS RN
  FROM TABLE1)
 SELECT PRODUCTCODE, QTY, PYEAR, PMONTH
 FROM CTE
 WHERE RN = 1

这里有一个SQL问题:

“主要的问题是,我担心性能会很慢”停止猜测,开始分析。其他任何事情都是浪费时间。可能的重复我还建议在不同的列中保留一个日期列,而不是年和月。“主要的问题是,我担心性能会很慢”停止猜测,开始分析。其他任何事情都是浪费时间。我还建议保留一个日期列,而不是在不同的列中保留年和月。