Sql server 使用OVER()如果客户有watch gladiator,则使用1或0 SQL SERVER

Sql server 使用OVER()如果客户有watch gladiator,则使用1或0 SQL SERVER,sql-server,Sql Server,我想我需要一些关于我的问题的指导。我正在努力 Watched_Gladiator=CASE WHEN FilmName IN (CASE WHEN FilmName LIKE '%Gladiator%' THEN 1 END) then OVER(PARTITION BY Cust_Nr) THEN 1 ELSE 0 END 我也试过这个: Watched_Gladiator=CASE WHEN FilmName IN (CASE WHEN FilmName LIKE '%Gladiator

我想我需要一些关于我的问题的指导。我正在努力

Watched_Gladiator=CASE WHEN FilmName IN (CASE WHEN FilmName LIKE '%Gladiator%' THEN 1 END) then  OVER(PARTITION BY Cust_Nr) THEN 1 ELSE 0 END
我也试过这个:

Watched_Gladiator=CASE WHEN FilmName IN (CASE WHEN FilmName LIKE '%Gladiator%' THEN Filmnamne END) then  OVER(PARTITION BY Cust_Nr) THEN 1 ELSE 0 END
我当前收到的错误是:

Incorrect syntax near the keyword 'OVER'.
这基本上就是我的数据的样子

Cust_Nr    Date        FilmName                     Watched Gladiator      
    157649306   20150430    Gladiator                        1
    158470722   20150504    Nick Cave: 20,000 Days On Earth  0
    158467945   20150504    Out Of The Furnace               0
    158470531   20150504    FilmA                            0
    157649306   20150510    Gladiator                        1
    158470722   20150515    Gladiator                        1
我想创建一个列1或0,显示客户是否观看过《角斗士》,然后是1或0。我该怎么做

我创建了一个测试列,尝试使用“%Gladiator%”这样的简单名称,然后使用1或0。此解决方案的问题在于,如果客户已观看多次,它将不止一次显示1。我只需要1或0

我觉得我真的快要找到解决办法了。我对使用OVER和CASE非常陌生,但我很享受这种刺激:=

所以你是这么说的:

SELECT Cust_Nr, Date, FilmName, 
       CASE WHEN FilmName LIKE '%Gladiator%' THEN 1 ELSE 0 END as WatchedGladiator
FROM YourTable
WHERE YourColumn = @somevalue
不起作用?因为根据你提供的数据,它应该是

编辑:

根据Tim的评论,我只想在查询中添加这一点

   SELECT Cust_Nr, Date, FilmName, WatchedGladiator
   FROM
   (
      SELECT Cust_Nr, Date, FilmName, 
             CASE WHEN FilmName LIKE '%Gladiator%' THEN 1 ELSE 0 END as WatchedGladiator
      FROM YourTable
      WHERE YourColumn = @somevalue
   ) as wg
   WHERE WatchedGladiator = 1

尝试按客户/胶片级别分组:

select
cust_nbr,
case when film_name like '%Gladiator%' then 1 else 0 end
from
(
select
    cust_nbr,
    film_name
    from
    <your table>
    group by
    cust_nbr,
    film_name
) t
或者,作为替代方案:

select distinct cust_nbr
from
<your table>
where 
filmname = 'Gladiator'

所以,如果该客户观看了特定的电影,您希望按客户分组并添加一列

你可以做:

SELECT Cust_Nr, MAX(Watched_Gladiator) 
FROM( SELECT Cust_Nr, 
            Watched_Gladiator = CASE WHEN EXISTS
            (
              SELECT 1 FROM CustomerFilm c2
              WHERE c2.Cust_Nr = c1.Cust_Nr 
              AND   c2.FilmName LIKE '%Gladiator%'
            ) THEN 1 ELSE 0 END
     FROM CustomerFilm c1 ) X
GROUP BY Cust_Nr

但是,如果您使用客户表而不是此表,那么您就不需要分组方式了。

以下内容满足您对所有电影的要求:

select r.*,
       (case when row_number() over (partition by filmname order by date) = 1
             then 1 else 0
        end) as IsWatchedFirstAndGladiator
from results r;
仅限角斗士:

select r.*,
       (case when filmname = 'Gladiator' and row_number() over (partition by filmname order by date) = 1
             then 1 else 0
        end) as IsWatchedFirst
from results r;

这似乎不是customer表,而是存储客户所观看内容的表。您必须使用customer表,然后不需要按Cust_Nr分组。OVER是一个窗口函数,与聚合/排名函数一起使用。我认为你不需要用cust_nbr和filmname的OVER at all group,然后在filmname='Gladiator'然后1 else 0结束时进行case。表中的值如何让人们假设事情,这很有趣。:=如果正确阅读,那么就没有问题。@dotn00b看看他提出的其他问题,然后选择。他们中的大多数人都是sameNo,他想知道每一位顾客是否看过一部包含《角斗士》的电影,但不一定在这部电影中。@TimSchmelter-我认为剪辑应该满足OP的基本要求。但要回答OP的另一个问题。这个问题不需要OVER。您好,我看到了关键字MAX,并找到了它:=Watched_Gladiator=MAXCASE当filmname像“%Gladiator%”时,然后是1,否则0结束。@dataaddicted-我很想看看您编写的最终查询。如果你能把它加入你的OP,那就太好了。