Sybase - 如何在派生表中使用“ORDER BY”

问题描述 投票:0回答:1

过了一段时间,我再次寻求帮助,因为我想不出解决方案。

我有这个 SQL 查询:

SELECT * FROM (SELECT TOP 1 
ac_registr,
event,
CASE 
WHEN dimension = "C" THEN "Cycles"
END AS "dimension",
togo AS "togo cycles",
CEILING (0) AS "togo days",
FLOOR (0) AS "togo hours",
absolute_due_at_ac AS "Due at cycles",
CONVERT( char(10), 0) AS "Due at date",
FLOOR (0) AS "Due at hours",
CONVERT( char(10), dateadd(day, expected_date, 'DEC 31 1971'), 104) AS "expected_date_of_perform",
event_display
FROM forecast 
WHERE ac_registr IN ('HEU')        
      AND dimension = 'C'
      AND expected_date <= 19669
      AND expected_date <> 0
/*ORDER BY togo ASC*/) C 

UNION

SELECT * FROM (SELECT TOP 1 
ac_registr,
event,
CASE 
WHEN dimension = "D" THEN "Days"
END AS "dimension",
0 AS "togo cycles",
CEILING (togo/1439) AS "togo days",
FLOOR (0) AS "togo hours",
0 AS "Due at cycles",
CONVERT( char(10), dateadd(day, absolute_due_at_ac, 'DEC 31 1971'), 104) AS "Due at date",
FLOOR (0) AS "Due at hours",
CONVERT( char(10), dateadd(day, expected_date, 'DEC 31 1971'), 104) AS "expected_date_of_perform",
event_display
FROM forecast 
WHERE ac_registr IN ('HEU')        
      AND dimension = 'D'
      AND expected_date <= 19669
      AND expected_date <> 0
/*ORDER BY togo ASC*/) D

UNION

SELECT * FROM(SELECT TOP 1 
ac_registr,
event,
CASE 
WHEN dimension = "H" THEN "Hours"
END AS "dimension",
0 AS "togo cycles",
CEILING (0) AS "togo days",
FLOOR (togo/60) AS "togo hours",
0 AS "Due at cycles",
CONVERT( char(10), 0) AS "Due at date",
FLOOR (absolute_due_at_ac/60) AS "Due at hours",
CONVERT( char(10), dateadd(day, expected_date, 'DEC 31 1971'), 104) AS "expected_date_of_perform",
event_display
FROM forecast 
WHERE ac_registr IN ('HEU')        
      AND dimension = 'H'
      AND expected_date <= 19669
      AND expected_date <> 0
/*ORDER BY togo ASC*/) H

该查询包含三个子查询“块”,每个子查询仅返回一行所需的值。所有数据都来自一张表,但其中一些(重要的)需要计算或转换。这不是问题,因为显示的数据格式正确。

问题是,我单独做了每个块,所以我可以看到结果是否是我们需要的。然后我通过

UNION
命令将结果连接在一起,如果我将所有
ORDER BY
子句放入注释中,它会以适当的格式显示结果,但数据不正确(因为它们不再排序)。

我还尝试考虑不同的解决方案,在其中处理有序数据,但我不知道如何仅选择每个维度的“顶行”。对此的查询是:

SELECT ac_registr,
       event,
       event_type,
       CASE
    WHEN dimension = "C" THEN "Cycles"
    WHEN dimension = "D" THEN "Days"
    WHEN dimension = "H" THEN "Hours"
END AS "dimension",
       togo,
       absolute_due_at_ac,
    CONVERT( char(10), dateadd(day, expected_date, 'DEC 31 1971'), 104) AS "expected_date"
FROM forecast  
WHERE ac_registr IN ('HEU')        
      AND dimension IN ('C', 'D', 'H')      
      AND expected_date <= 19669
      AND expected_date <> 0
ORDER BY dimension, togo ASC

但我不知道如何仅选择相对行(每个维度的顶部行)。我无法使用固定行号,因为这可能会有所不同,当我尝试使用

CASE
命令时,它返回了错误。

在第一种情况下是否可以以某种方式对派生表中的数据进行排序? 或者如何在第二种情况下为每个维度选择第一行?

我真的不知道,所以我将不胜感激任何帮助。

另外,我会添加一个注释,不可能仅通过 forecast.togo 列对数据进行排序,因为所有要求都具有不同的值大小,正如您在第一个查询中可能注意到的那样。

预先感谢您, 真挚地, 卡雷尔

sql sybase
1个回答
0
投票

使用

ROW_NUMBER()
窗口功能选择每个维度的顶部一个。 (如果 Sybase 支持...)

select * from
(
    SELECT ac_registr,
           event,
           event_type,
           CASE
             WHEN dimension = 'C' THEN 'Cycles'
             WHEN dimension = 'D' THEN 'Days'
             WHEN dimension = 'H' THEN 'Hours'
           END AS "dimension",
           togo,
           absolute_due_at_ac,
           CONVERT( char(10), dateadd(day, expected_date, 'DEC 31 1971'), 104) AS "expected_date",
           ROW_NUMBER() OVER (PARTITION BY dimension ORDER BY togo ASC) rowno
    FROM forecast  
    WHERE ac_registr IN ('HEU')        
      AND dimension IN ('C', 'D', 'H')      
      AND expected_date <= 19669
      AND expected_date <> 0
) dt
WHERE rowno = 1
ORDER BY dimension, togo ASC
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.