创建sql视图,其中select取决于两列的值

时间:2015-09-20 20:26:23

标签: sql sql-server sql-view

我想基于这三个表在我的数据库中创建一个视图: enter image description here

对于Weight中具有相同值的行,我想在table3中选择Count中值最高的行。

然后我希望它们按Category_ID分组并按Date排序,这样如果table3中的两行相同,我想要最新的。

让我举个例子:

表1

ID | Date       | UserId
1  | 2015-01-01 | 1
2  | 2015-01-02 | 1

表2

ID | table1_ID | Category_ID
1  | 1         | 1
2  | 2         | 1

表3

ID | table2_ID | Count | Weight
1  | 1         | 5     | 10 
2  | 1         | 5     | 20      <-- count is 5 and weight is highest
3  | 1         | 3     | 40      
4  | 2         | 5     | 10
5  | 2         | 3     | 40      <-- newest of the two equal rows

然后结果应该是表3中的第2行和第5行。

PS 我在mssql中这样做。

PPS 我知道如果标题不合适,但我不知道如何制定好标题。

2 个答案:

答案 0 :(得分:2)

SELECT
    *
FROM
(
    SELECT
        t3.*
        ,RANK() OVER (PARTITION BY [Count] ORDER BY [Weight] DESC, Date DESC)   highest
    FROM TABLE3 t3
    INNER JOIN TABLE2 t2 ON t2.Id = t3.Table2_Id
    INNER JOIN TABLE1 t1 ON t1.Id = t2.Table1_Id
) t
WHERE t.Highest = 1

这将按计数分组(必须相同)。然后它将确定哪个具有最高权重。如果他们中的两个人具有相同的“最高”重量,则需要使用最近日期的那个。

答案 1 :(得分:1)

您可以在此处使用RANK()分析函数,并为这些行提供排名,然后为每个ID选择第一个排名

这样的东西
select * 
from 
    (select 
         ID, table2_ID, Count, Weight,
         RANK() OVER (PARTITION BY ID ORDER BY Count, Weight DESC) as Highest 
     from table3) 
where Highest = 1;

这是Oracle的语法,如果您不使用它,请在互联网上查找您的语法应该几乎相同