以最小的专一性插入最新的行

时间:2018-10-11 19:18:39

标签: sql sql-server

我将首先解释数据模型,然后说明所需的结果以及我尝试过的工作。

我有vehiclessales表:

CREATE TABLE VEHICLE
(
    ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
    BRAND INT NOT NULL,
    MODEL VARCHAR(255),
    VERSION VARCHAR(255),

    UNIQUE(BRAND, MODEL, VERSION),
    FOREIGN KEY(BRAND) REFERENCES BRAND(ID)
)

CREATE TABLE SALES 
(
    ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
    VEHICLE_ID INT NOT NULL,
    DATE DATE NOT NULL,
    SALE INT NOT NULL,
    CREATED_DATE DATETIME NOT NULL DEFAULT GETDATE(),

    FOREIGN KEY (VEHICLE_ID) REFERENCES VEHICLE(ID)
)

这样,我可以在同一日期为同一车辆插入多个条目(当我要更新时,我会插入新行)

INSERT INTO SALES (VEHICLE_ID, DATE, SALE, USER_ID)   
VALUES (1, '2018-01-01', 2, 3) -- then later i update by inserting a new row
       (1, '2018-01-01', 4, 3)

我想检索在特定日期范围内插入的最后一笔交易(使用DATE),然后过滤特定的BRAND,型号或版本。

我通过这样做使它正常工作

SELECT 
    S.DATE AS date, SUM(S.SALE_PROJECTION) AS saleProjection
FROM 
    SALE_PROJECTION S,
    (SELECT MAX(ID) AS id 
     FROM SALE_PROJECTION 
     WHERE DATE >= CAST(@dateStart AS DATE) 
       AND DATE <= CAST(@dateEnd AS DATE) 
     GROUP BY DATE, VEHICLE_ID) S_M,
    VEHICLE V
WHERE 
    1 = 1
    AND S.ID = S_M.ID
    AND S.VEHICLE_ID = V.ID
    AND V.BRAND = 1
    AND V.MODEL = 'A6'
    AND V.VERSION = '1.0'
GROUP BY S.DATE
ORDER BY DATE

问题是我想获得具有最小特异性的品牌1的销售,这意味着: 如果我有3辆车:

(1, 'A3', '1.0'),
(1, 'A3', '2.0'),
(1, 'A3', null),
(1, null, null);
  • 如果我插入销售(1,2018-01-01,2,3)
  • 如果我插入销售(2,2018-01-01,3,3)-2018-01-01的总和为5
  • 但是要插入一个(2,2018-01-01,3,3)的交易-2018-01-01的总和必须为3,因为它是最后插入的具有最小特异性的

但对立面也必须正确

  • 如果我插入销售(3,2018-01-01,4,3)
  • 然后插入(1,2018-01-01,1,3)的销售
  • 然后插入(2,2018-01-01,1,3)的特价商品
  • 2018-01-01的总和必须为2,因为它是最后插入的

品牌,型号,版本的最一般组合必须“隐藏”最具体的内容。

我需要更改数据模型吗?或者这可能吗? 如果需要,我可以提供更多示例。

预先感谢

0 个答案:

没有答案