过了一段时间,我再次寻求帮助,因为我想不出解决方案。
我有这个 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 列对数据进行排序,因为所有要求都具有不同的值大小,正如您在第一个查询中可能注意到的那样。
预先感谢您, 真挚地, 卡雷尔
使用
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