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