我正在开发 Adaptive Server Enterprise / 15.7 / EBF 25127 SMP SP136 / P / x86_64 / Enterprise Linux / ase157sp136x / 3955/64位/ FBO / Mon Oct 19 19:12:00 2015
我有一张表格,其中包含多个日期和价格的记录,我希望选择最近的日期和最高或最高的价格。
对于错误消息, max()功能似乎无法正常工作,只返回数十万条记录。当我尝试 Row_number()或 Rank()OVER(按列名按列名排序)我在 OVER不正确附近收到语法错误。在读取其他线程时,看起来这在Sybase ASE中不可用。
还有另一种方法可以实现这个目标吗?
表格中的一条记录示例:
ID TRADE_DATE TRADE_PRICE
B52A 05/12/2016 91
B52A 05/13/2016 85
B52A 05/13/2016 86
B52A 05/16/2016 85
B52A 05/16/2016 90
预期输出(每条记录只有一行,没有重复):
ID TRADE_DATE TRADE_PRICE
B52A 05/16/2016 90
我的代码:
SELECT T1.ID
FROM T1
LEFT JOIN
(SELECT
T2.ID,
T2.TRADE_DATE,
T2.TRADE_PRICE
FROM T2
WHERE ID='B52A')
ON T2.ID=T1.ID
另外,如果我尝试这样做:
SELECT
ID,
MAX(TRADE_DATE),
MAX(TRADE PRICE)
FROM T2
WHERE ID ='B52A'
GROUP BY
ID
ORDER BY
ID
TRADE_DATE
TRADE_PRICE
它选择了正确的记录,但它重复了5次:
ID TRADE_DATE TRADE_PRICE
B52A 05/16/2016 90
B52A 05/16/2016 90
B52A 05/16/2016 90
B52A 05/16/2016 90
B52A 05/16/2016 90
答案 0 :(得分:0)
您不能使用OVER语法,因为SAP / Sybase ASE数据库不支持它。
您需要手动编写SQL代码。一个例子是:
SELECT
T1.ID, x.max_TRADE_DATE, max(TRADE_PRICE) AS max_TRADE_PRICE
FROM
(
SELECT ID, MAX(TRADE_DATE) AS max_TRADE_DATE
FROM T1 GROUP BY ID
) x
JOIN
T1 on T1.ID = x.ID and T1.TRADE_DATE = x.max_TRADE_DATE
GROUP BY
T1.ID, x.max_TRADE_DATE