Мне нужна помощь по этой проблеме

#mysql #sql-server

#mysql #sql-сервер

Вопрос:

Допустим, у меня есть таблица с двумя столбцами. На самом деле это будет в двух разных таблицах, но для упрощения давайте использовать одну таблицу. Я просто хочу знать, как я могу решить эту проблему

      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-02 Для 2015-01
  • 2017-01 Для 2017-01
  • 2018-00 до 2017-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

Комментарии:

1. это самосоединение: select * from foo left join foo AS bar on foo.A > bar.B

2. Гипотетическая проблема и реальная проблема совершенно разные.

3. Почему бы вам не написать это так, как оно есть на самом деле. Две таблицы.

4. предположим, что столбец A находится в таблице A, а столбец B — в таблице B. Я думал о перекрестном соединении , но у меня миллионы записей , и это может не сработать ….

Ответ №1:

В SQL Server вы можете использовать что-то вроде этого:

 ;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
  

Идея состоит в том, чтобы заменить - на nothing, чтобы сделать значения похожими 201501 , а затем сравнить их как int значения.

Ответ №2:

Используйте 2 разные таблицы

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

Комментарии:

1. У них есть только 1 таблица. И почему вы используете перекрестное соединение, а затем превращаете его во внутреннее соединение?

2. @SeanLange Мой плохой .. вы правы в объединении. Кроме того, фактическая проблема связана с 2 таблицами в соответствии с вопросом