2016-07-03 9 views
0

Мой маленький продуктовый магазин сотрудничает с третьей стороной, чтобы принимать онлайн-заказы. Я сделал лист Excel, который запрашивает нашу базу данных продукта для получения информации о продукте, и я передаю эти данные в другой лист с поддержкой макросов, который делает тяжелую работу и генерирует .CSV, который я загружаю каждую неделю.Определите, какая продажа POS имеет преимущество. Следующее логическое дерево в Sybase SQL Anywhere 10

То, что я пытаюсь сделать сейчас, это получить текущую и будущую информацию о продажах, чтобы мы могли их рекламировать. Продажи создаются в нашей POS, помещая их в группы, называемые «рабочими листами». Усложняющим фактором является то, что продукт может существовать сразу на нескольких листах, а также используется логическое дерево, чтобы определить, какие из листов будут влиять на цену сканирования в любой момент времени.

Два атрибута, которые определяют приоритет, являются «приоритетом» и «датой совершены».

  • Три приоритета: высокий, средний и низкий представлены как 1, 2 и 3 соответственно. Листы с более высоким приоритетом всегда будут переопределять листы с более низким приоритетом в течение всего срока их службы.
  • Если рабочие листы имеют одинаковые приоритеты, то последнее, что было совершено последним, имеет приоритет.

Таким образом, учитывая данные, что выглядит следующим образом:

item_id  worksheet_name priority date_committed   sale_start_date   sale_end_date    sale_price 
011259904209 A    2   2016-06-22 09:21:09.041 2016-06-29 00:00:00.000 2016-07-20 11:00:00.000 2.0000 
074682105322 B    2   2016-06-22 09:49:31.722 2016-07-20 00:00:00.000 2016-08-03 11:00:00.000 2.0000 
074682105322 C    2   2016-06-22 08:57:04.641 2016-07-19 00:00:00.000 2016-08-03 16:00:00.000 2.0000 
042563013660 A    2   2016-06-22 09:21:09.048 2016-06-29 00:00:00.000 2016-07-20 11:00:00.000 3.9900 
042563013660 D    1   2016-06-25 14:03:33.499 2016-06-29 00:00:00.000 2016-07-05 23:59:59.000 2.9900 
042563013660 E    2   2016-06-22 08:49:13.515 2016-06-28 00:00:00.000 2016-07-20 16:00:00.000 3.9900 
073360772054 A    2   2016-06-22 09:21:09.114 2016-06-29 00:00:00.000 2016-07-20 11:00:00.000 3.9900 
073360772054 B    2   2016-06-22 09:49:31.831 2016-07-20 00:00:00.000 2016-08-03 11:00:00.000 3.9900 
073360772054 E    2   2016-06-22 08:49:13.520 2016-06-28 00:00:00.000 2016-07-20 16:00:00.000 3.9900 
073360772054 C    2   2016-06-22 08:57:04.649 2016-07-19 00:00:00.000 2016-08-03 16:00:00.000 3.9900 
012993221010 A    2   2016-06-22 09:21:09.110 2016-06-29 00:00:00.000 2016-07-20 11:00:00.000 3.3900 
012993221010 B    2   2016-06-22 09:49:31.828 2016-07-20 00:00:00.000 2016-08-03 11:00:00.000 3.3900 
012993221010 D    1   2016-06-25 14:03:33.502 2016-06-29 00:00:00.000 2016-07-05 23:59:59.000 2.9900 
012993221010 E    2   2016-06-22 08:49:13.517 2016-06-28 00:00:00.000 2016-07-20 16:00:00.000 3.3900 
012993221010 C    2   2016-06-22 08:57:04.646 2016-07-19 00:00:00.000 2016-08-03 16:00:00.000 3.3900 

Я хочу, чтобы получить это:

Run on 6/27    
item_id  worksheet_name sale_start_date   sale_end_date    sale_price 
011259904209 A    2016-06-29 00:00:00.000 2016-07-20 11:00:00.000 2.0000 
074682105322 C    2016-07-19 00:00:00.000 2016-07-20 00:00:00.000 2.0000 
042563013660 E    2016-06-28 00:00:00.000 2016-06-29 00:00:00.000 3.9900 
073360772054 E    2016-06-28 00:00:00.000 2016-06-29 00:00:00.000 3.9900 
012993221010 E    2016-06-28 00:00:00.000 2016-06-29 00:00:00.000 3.9900 


Run on 6/29    
item_id  worksheet_name sale_start_date   sale_end_date    sale_price 
011259904209 A    2016-06-29 00:00:00.000 2016-07-20 11:00:00.000 2.0000 
074682105322 C    2016-07-19 00:00:00.000 2016-07-20 00:00:00.000 2.0000 
042563013660 D    2016-06-29 00:00:00.000 2016-07-05 23:59:59.000 2.9900 
073360772054 A    2016-06-29 00:00:00.000 2016-07-19 00:00:00.000 3.9900 
012993221010 D    2016-06-29 00:00:00.000 2016-07-05 23:59:59.000 2.9900 

бонусных баллы для объединения перекрывающихся периодов продаж отражают восприятие покупателя, но это не обязательно.

Как получить этот результат с помощью SQL? Наши продажи работают со среды по вторник, и я идеально генерирую файл данных на предстоящую неделю в среду днем ​​или в четверг утром после того, как мы закончим наши недельные изменения цен.

У нас есть десятки тысяч продуктов в файле.

Here's a graphical representation of the worksheet priorities per day

Это для SQL Anywhere 10, и работает SELECT @@VERSION говорит мне 12.0.1.3967

ответ

0

я в основном знакомы с SQL Server, но SQL компании Sybase Anywhere все еще очень похожи.

Это проблема с наибольшей ошибкой в ​​группе. Типичным решением (во всяком случае, кроме MySQL) является использование ROW_NUMBER(), которое доступно в SQL Anywhere 10 и более поздних версиях, насколько я могу судить по онлайн-книгам Sybase.

SELECT a.item_id, 
    a.worksheet_name, 
    a.sale_start_date, 
    a.sale_end_date, 
    a.sale_price 
FROM (
    SELECT item_id, 
     worksheet_name, 
     sale_start_date, 
     sale_end_date, 
     sale_price, 
     ROW_NUMBER() OVER (PARTITION BY item_id ORDER BY priority, date_committed DESC) AS rn 
    FROM UnnamedSalesTable 
    WHERE sale_start_date <= CURRENT DATE 
     AND sale_end_date > CURRENT DATE) a 
WHERE a.rn = 1 

Очевидно, что вы можете заменить CURRENT DATE с любой датой валютирования вы хотите запустить.

Если у вас есть два варианта продаж с одинаковыми priority и date_committed, вы все равно получите только одну строку. Другими словами, если есть дубликаты, вы не будете знать. Я подозреваю, что это то, чего ты хочешь. Однако, если вам нужно увидеть дубликаты, вместо ROW_NUMBER() вы хотите использовать RANK() или DENSE_RANK() (либо работайте в этом случае). Это позволит увидеть «связи». В противном случае запрос будет идентичным.Если это дублирование происходит очень часто, то вы захотите добавить третий столбец к части ORDER BY предложения WINDOW.

+0

Спасибо. Это работает достаточно хорошо, чтобы я принял ответ, но он оставляет пробел, когда другой лист с более высоким приоритетом начинается в середине другого периода рабочего листа. Наши продажи в основном начинаются в тот же день недели, так что это не большая сделка. Я думаю, что наши выходные продажи просто должны быть видны только для покупателей в магазине. Кроме того, я предполагаю, что для полного решения потребуется намного больше обработки. – picobit

+0

Что бы я сделал в этом случае, напишите второй запрос, который будет выглядеть специально для ваших исключений. Мне кажется, что этот запрос покроет вас за 90% ваших продаж, так что вам просто нужен какой-то способ снять свои исключения. –