SQL Server分区非标准化数据

时间:2012-09-07 13:26:40

标签: sql-server sql-server-2008 normalization database-partitioning

我认为可能有办法对此进行分区以找到我想要的东西,但我看不到它。我有一些关于产品集的非标准化数据:

SetItemID   ComponentItemID quantity    IsPrimary
123         234             1           1
123         345             2           0
456         567             3           1
456         678             2           0

我需要找到quantity所描述的集合,例如IsPrimary组件的quantity> “值isPrimary = 0 component's量。我还需要找到组件之间数量相等的集合等。如果需要,可以使用多个语句

到目前为止我所做的只是部分PARTITION声明可能会或可能不是正确的方法,但我无法弄清楚如何比较集合中的数量

WITH setdata as
(select *, row_number() OVER(
    PARTITION by s.setitemid order by s.setitemid) position from set_table s )
// descending just to get newer sets
SELECT* from setdata order by setitemid desc

2 个答案:

答案 0 :(得分:0)

如果我正确地遵循您的要求,应该这样做:

SELECT p1.SetItemId
 from (--  IsPrimary = 1
       select SetItemID, ComponentItemId, Quantity
        from SetData
        where IsPrimary = 1) p1
  inner join (--  IsPrimary = 0
              select SetItemID, ComponentItemId, Quantity
               from SetData
               where IsPrimary = 0) p0
   on p0.SetItemID = p1.SetItemID
    and p1.Quantity > p0.Quantity
  --and p1.Quantity = p0.Quantity

将最后一行用于数量相等的集合。

答案 1 :(得分:0)

SELECT *
FROM   set_table a
WHERE  isPrimary = 1
       AND quantity > (SELECT quantity
                       FROM   set_table b
                       WHERE  a.setItemId = b.setItemId
                              AND isPrimary = 0)
ORDER  BY setItemId DESC

或者

SELECT a.*
FROM   set_table a
       INNER JOIN set_table b
               ON a.setItemId = b.setItemId
                  AND a.isPrimary = 1
                  AND b.isPrimary = 0
WHERE  a.quantity > b.quantity