Выяснение того, когда значение остается неизменным в таблице, используя чистый SQL-запрос без какой-либо процедуры или функции - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть таблица, как показано ниже, об информации об акциях, которая обновляется ежедневно без удаления прежних данных.

Table Name : StockInfo
---------------------------------------------
Date    |   ProductName   |    Stock        |
---------------------------------------------
20, Jul |     Buds        |   0             |
---------------------------------------------
20, Jul |     Monitor     |   1             |
---------------------------------------------
19, Jul |     Buds        |   0             |
---------------------------------------------
18, Jul |     Monitor     |   0             |
---------------------------------------------
17, Jul |     Buds        |   1             |
---------------------------------------------
16, Jul |     Monitor     |   15            |
---------------------------------------------
15, Jul |     Buds        |   5             |
---------------------------------------------
14, Jul |     Buds        |   0             |
---------------------------------------------

- обратите внимание, что данные монитора 15 июля отсутствуют, потому что монитор недавно вышел в16 июля.

Используя таблицу выше, я хочу получить следующее. Предположим, что сегодня 20 июля.

--------------------------------------------------------------
| ProductName    |    IsSoldoutNow     |     SoldoutDate     |
--------------------------------------------------------------
|   Buds         |       TRUE          |      19, July       |
--------------------------------------------------------------
|  Monitor       |       FALSE         |        NULL         |
--------------------------------------------------------------

Можно ли обрезать такое значение, используя чистый SQL с хорошей производительностью? То, что я хочу знать, является ли определенный продукт распроданным или нет, и если распродано, с каких пор? Я планирую join выше таблицы с другой таблицей, как показано ниже, и создам Excel-подобную таблицу в Интернете с помощью Node. И запросы должны быть быстрыми из-за рендеринга с помощью прокрутки вниз, вверх.

--------------------------------------------------------
| ProductName  |  Price  | IsSoldoutNow  | SoldoutDate |
--------------------------------------------------------

Я решил обработать это в Javascript, но это даст эффект кровати на производительности, и я должен отказаться от группировки на стороне DB исортировка.

Как я могу получить такие данные?

1 Ответ

0 голосов
/ 07 ноября 2019
drop table if exists t;
create table t
(Dt  date,   ProductName  varchar(20),    Stock int);
insert into t values
('2019-07-20',     'Buds'        ,   0) ,            
('2019-07-20',     'Monitor'     ,   1) ,            
('2019-07-19',     'Buds'        ,   0) ,            
('2019-07-18',     'Monitor'     ,   0) ,            
('2019-07-17',     'Buds'        ,   1) ,            
('2019-07-16',     'Monitor'     ,   15),            
('2019-07-15',     'Buds'        ,   5) ,            
('2019-07-14',     'Buds'        ,   0 );            

     select t.*,t1.dtlastinstock,firstsoldout,
            case when t.stock = 0 then 'true' else 'false' end as soldout,
            case when t.stock = 0 then firstsoldout else null end as soldoutdate
     from t 
     left join
     (
      select dt,productname,stock,dtlastinstock,
                (select dt from t t1 
                        where t1.dt > dtlastinstock and t1.productname = s.productname and stock = 0
                        order by dt limit 1) firstsoldout
      from
      (
      select   dt,productname,stock,
                    (select dt from t t1 
                        where t1.dt < '2019-07-20' and t1.productname = t.productname and stock > 0
                        order by dt desc limit 1) dtlastinstock
      from t
     where dt = 
     (select dt from t t1 
     where t1.dt <= '2019-07-20' and t1.productname = t.productname 
     order by dt desc limit 1) and
     stock = 0
     ) s
     ) t1 on t1.productname = t.productname
     where t.dt =
         (select dt from t t1 
     where t1.dt <= '2019-07-20' and t1.productname = t.productname 
     order by dt desc limit 1) ;

Где внутренний запрос находит последний раз, когда товар находился на складе, и изменяет положение, чтобы найти первую дату продажи после этого, если она есть. И внутренний, и внешний запрос ищут самую последнюю запись для элементов на основе даты.

+------------+-------------+-------+---------------+--------------+---------+-------------+
| Dt         | ProductName | Stock | dtlastinstock | firstsoldout | soldout | soldoutdate |
+------------+-------------+-------+---------------+--------------+---------+-------------+
| 2019-07-20 | Buds        |     0 | 2019-07-17    | 2019-07-19   | true    | 2019-07-19  |
| 2019-07-20 | Monitor     |     1 | NULL          | NULL         | false   | NULL        |
+------------+-------------+-------+---------------+--------------+---------+-------------+
2 rows in set (0.00 sec)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...