2011-04-15 102 views
4

我有这样之前,选择最接近的值后

设A表说,表是SHOW_DATE

different | date 
---------------------- 
    -2 | 2011-04-18 
---------------------- 
    -1 | 2011-04-19 
---------------------- 
    4 | 2011-04-24 
---------------------- 
    5 | 2011-04-25 
---------------------- 

我要选择2个值,第一个是第一的负值,第二个是第一个正面价值。在这个示例中的 将导致-1(2011-04-19)和4(2011-04-24)

我尝试按abs(不同)顺序排列,但它给出2最近的-1和 - 2

+0

能帮你在输入更清晰?你有这个表格,你输入''来获得''的最接近的正值和负值?是否输入日期并在该日期之前和之后找到最近的日期? – Thomas 2011-04-15 04:54:05

回答

3
SELECT 
    MIN(CASE WHEN different > 0 THEN different ELSE NULL END) AS MinPositive, 
    MAX(CASE WHEN different < 0 THEN different ELSE NULL END) AS MaxNegative 
FROM show_date 
+0

的路要走...我喜欢这一点。 .. – 2011-04-15 06:44:19

+0

@Yanuar Lutfi:这不会返回'日期' – zerkms 2011-04-15 10:10:30

4
(SELECT * FROM show_date WHERE different < 0 ORDER BY different DESC LIMIT 1) 
UNION ALL 
(SELECT * FROM show_date WHERE different >= 0 ORDER BY different LIMIT 1) 
+0

我想要一个没有工会的查询 – 2011-04-15 04:25:40

+2

@Yanuar Lutfi:1.它是一个查询。 2.“UNION”有什么问题? 3.在我浪费时间之前,为什么你在Q中没有提到? – zerkms 2011-04-15 04:26:34

+2

@ yanuar-lutfi有什么特别的原因? – 2011-04-15 04:27:10

1
SELECT 
    min (a.nr), 
    max (b.nr) 
FROM 
    demo a, 
    demo b 
WHERE a.nr > 0 
    AND b.nr < 0; 

min | max 
-----+---- 
    1 | -1 
(1 Row) 

的另一种方法 - 上述方案对于大表获得问题:

SELECT min(date) 
    FROM tbl 
    WHERE date > 0 
UNION 
SELECT max(date) 
    FROM tbl 
    WHERE date < 0; 
+0

即使我upvoted这一点 - 我仍然不认为笛卡尔prod uct适合于此任务。 – zerkms 2011-04-17 12:03:08

+0

取决于表格的大小和分析仪的聪明程度,不是吗? – 2011-04-17 12:11:58

+0

@user unknown:我不会说mysql的优化器很聪明;-)如果我们谈论的是oracle 10+,那么可能是的,但不是mysql的。 – zerkms 2011-04-17 12:18:56