Talep Tahmininin Ayrıştırılması için Basit Şema Tasarlama


9

Aşağıdaki durum için temel bir şema tasarımı bulmak zorunda olduğu bir eğitim tatbikatı olarak basit bir veritabanı tasarım görevi yapıyorum:

Üst-alt ürün hiyerarşim var (örneğin, Hammadde> Devam Eden İşler> Son Ürün).

  • Siparişler her seviyede verilir.
  • Siparişlerin sayısı önümüzdeki 6 ay için haftalık bölümlerde görüntülenebilir.
  • Her ürün seviyesi için talep tahmini yapılabilir.
  • Önümüzdeki 6 ay içinde herhangi bir hafta için talep tahmini bugün yapılabilir.
  • Talep tahmini önümüzdeki 6 ay boyunca haftalık bölümler için yapılır.

Talep Tahmini genellikle hiyerarşide daha yüksek seviyede yapılır (Hammadde veya Devam Eden İşler seviyesi) Daha düşük bir seviyeye (Son Ürün) ayrıştırılmalıdır.

Talep tahmininin daha yüksek bir seviyeden daha düşük bir seviyeye ayrılmasının 2 yolu vardır:

  1. Kullanıcı son ürün için yüzde dağılımını belirtir. Diyelim ki, Work In Progress için 1000 tahmini var ve kullanıcı, kova 10'daki Son Ürün 1 için% 40 ve Son Ürün 2 için% 60 istediğini söylüyor. Son Ürün 1 için 400 ve Son Ürün 2 için 600 olacaktır.
  2. Kullanıcı, yalnızca Bölüm 5'teki son ürünlere karşı verilen siparişlere göre ayrıldığını ve Son Ürün 1 ve 2 için bölüm 5'teki siparişlerin sırasıyla 200 ve 800 olduğunu, daha sonra EP1 için tahmini değerin ((200/1000) * 100)% olacağını söylüyor. ve EP2 için '(Devam Eden Çalışma') tahmininin ((800/1000) * 100)% 'si olacaktır.

Tahmin, önümüzdeki 6 ay boyunca haftalık bölümlerde görüntülenebilir ve ideal biçim şu şekilde olmalıdır:

product name | bucket number | week start date | week end date | forecast value | created_on

PRODUCT_HIERARCHY tablosu şöyle görünebilir:

id  |   name                |   parent_id
__________________________________________
1   |   raw material        |   (null)
2   |   work in progress    |   1
3   |   end product 1       |   2
4   |   end product 2       |   2

ORDERS tablosu şöyle görünebilir:

id | prod_id | order_date | delivery_date | delivered_date

nerede,

prod_ididPRODUCT_HIERARCHY tablosuna referans veren yabancı anahtardır ,

Tahmin nasıl saklanır? Böyle bir gereksinim için iyi bir temel şema ne olabilir?


26 haftalık kova için sipariş seçme fikrim:

SELECT
    COUNT(*) TOTAL_ORDERS,
    WIDTH_BUCKET(
        delivery_date,
        SYSDATE,
        ADD_MONTHS(sysdate, 6), 
        TO_NUMBER( TO_CHAR(SYSDATE,'DD-MON-YYYY') - TO_CHAR(ADD_MONTHS(sysdate, 6),'DD-MON-YYYY') ) / 7
    ) BUCKET_NO
FROM
    orders_table
WHERE
    delivery_date BETWEEN SYSDATE AND ADD_MONTHS(sysdate, 6);

Ancak bu, güne bakılmaksızın bugünden başlayarak haftalık kovalar verecektir. Oracle'da bunları Pazar'dan Cumartesi haftalarına nasıl dönüştürebilirim?

Lütfen bu veritabanı yapısının tasarlanmasına yardımcı olun.

(Oracle 11g kullanıyor olacak)


1
veri ambarı oluşturuyormuşsunuz gibi görünüyor. sipariş olgu tablosu olurdu. ürün ve tarih ölçü tabloları. Birkaç adımdan oluşan bir işleme bakarken, biriken bir olgu tablosunu kullanmak isteyebilirsiniz.
Neil McGuigan

Yanıtlar:


1

Tamam, işte benim ortaya koyduğum veri modeli.

PRODUCT - ürün bilgilerini depolamak ve ebeveyn-çocuk hiyerarşisini korumak için

id  NUMBER  "Primary Key Not Null"                  
level_code  VARCHAR2    Not Null                    
name    VARCHAR2    Not Null                    
description VARCHAR2                        
parent_id   NUMBER  Foreign Key references PRODUCT(id)                  

SİPARİŞLER - ürünler için siparişleri saklamak

id  NUMBER  "Primary Key Not Null"                  
prod_id     NUMBER  "Foreign Key references PRODUCT(id) Not Null"                   
order_type  VARCHAR2    "Not Null Default 'Default'"
order_qty   NUMBER  Not Null
order_date  NUMBER  Foreign Key references DATE_INFO(date_key)
delivery_date   NUMBER  "Foreign Key references DATE_INFO(date_key)
Check delivery_date >= order_date"

TAHMİN - ürünler için tahmin değerini saklamak (daha yüksek seviyeler için depo değeri, bir ebeveynden ayrıldıktan sonra daha düşük seviyeler için depo değeri)

id  NUMBER  "Primary Key Not Null"
product_id  NUMBER  "Foreign Key references PRODUCT(id) Not Null"
forecast_value  NUMBER  Not Null
week    NUMBER  "Foreign Key references DATE_INFO(date_key) Not Null"                   

DISAGGREGATION_RULES - bir değeri daha yüksek bir seviyeden daha düşük bir seviyeye ayırmak için hangi yöntemin kullanıldığını ve yüzde kaçının daha düşük seviyeye dağıtıldığını depolamak için

id  NUMBER  "Primary Key Not Null"
parent_product_id   NUMBER  "Foreign Key id references PRODUCT(id) Not Null"
child_product_id    NUMBER  "Foreign Key id references PRODUCT(id) Not Null"
method  VARCHAR2    Not Null                    
from_week   NUMBER  "Foreign Key references DATE_INFO(date_key) Not Null"
to_week NUMBER  "Foreign Key references DATE_INFO(date_key) Not Null Check end_week >= start_week"
percent_distribution    NUMBER  Not Null                    

DATE_INFO - tarih boyutu, başlangıç ​​tarihi (Cumartesi olmalıdır) ve bitiş tarihi hakkında, belirli bir tarihin düştüğü haftaya karşılık gelir

date_key    NUMBER  "Primary Key
Not Null"                   
full_date   DATE    Not Null                    
week_begin_date DATE    Not Null                    
week_end_date   DATE    Not Null

Kova numarasına gelince .. Aşağıdaki fonksiyonla hafta başlangıç ​​tarihini (Cumartesi günü, benim durumumda) hesaplıyorum

CREATE OR REPLACE FUNCTION get_week_start_date(v_bucket_num IN NUMBER)
  RETURN DATE
IS
  week_start_date DATE;
BEGIN
  SELECT (TRUNC(SYSDATE+2, 'IW')-2) + ((v_bucket_num-1) * 7)
  INTO week_start_date FROM dual;
  RETURN week_start_date;
END;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.