2016-10-05 104 views
1

假设我有一个两列的表格。事实上,它将在两个不同的表中,但让它简单的让我们使用一张表。我只是想知道我怎么能解决这个问题我需要此问题的帮助

 A |  B 
------------------------ 
2016-01 | 2015-00 
2016-02 | 2015-01 
2017-01 | 2017-01 
2018-00 | 2018-01  

我如何编写一个查询,接柱A,并与B列进行比较。

  • 2016-01对应于2015-01
  • 2016-022015-01
  • 2017-012017-01
  • 2018-002017-01(因为2018-00小于2018-01

如何确保列A仅从列B中挑选值,其中列A大于列B

我试着写一个查询作为

SELECT A FROM TB1 WHERE '1016-01' >= (SELECT MAX(B) FROM TB1) 

但此查询不会工作,因为max(b)总是返回`2017-01

+0

这是一个自加入:'select * from foo left join foo AS bar on foo.A> bar.B' –

+1

假设的问题和真正的问题是完全不同的。 – Strawberry

+1

你为什么不把它写成真正的样子。两张桌子。 – Drew

回答

-1

使用2页不同的表

SELECT A.Col, B.Col 
FROM A JOIN B ON A.Col >= B.Col 
+0

他们只有1个表。为什么你会使用交叉连接,然后把它变成内部连接? –

+0

交叉连接可能无法正常工作,因为我有数百万条记录.. – tita

+0

@SeanLange我的坏..你是正确的加入。另外,根据问题,实际问题与2个表相关 – Akash

0

SQL服务器你可以用这样的东西:

;WITH cte AS (
    SELECT * 
    FROM (VALUES 
    ('2016-01'),('2016-02'),('2017-01'),('2018-00') 
    ) as t(A) 
), cte1 AS (
    SELECT * 
    FROM (VALUES 
    ('2015-00'),('2015-01'),('2017-01'),('2018-01') 
    ) as t(B) 
) 

SELECT c.A, 
     t.B 
FROM cte c 
CROSS APPLY (
    SELECT TOP 1 B 
    FROM cte1 
    WHERE CAST(REPLACE(c.A,'-','') as int) >= CAST(REPLACE(B,'-','') as int) 
    ORDER BY B DESC 
    ) t 

将输出:

A  B 
2016-01 2015-01 
2016-02 2015-01 
2017-01 2017-01 
2018-00 2017-01 

的想法是什么也没有做像201501值,然后比较他们为int值替换-