Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 限制Unique显示_Sql_Sql Server_Duplicates - Fatal编程技术网

Sql 限制Unique显示

Sql 限制Unique显示,sql,sql-server,duplicates,Sql,Sql Server,Duplicates,我目前有这个SQL查询和这个输出 SELECT b.HotelNo,g.guestName,b.dateFrom,b.dateToFrom Booking b, Guest g FROM Booking b, Guest g WHERE b.guestNo = g.guestNo GROUP BY b.hotelNo,b.dateFrom,b.dateTo,g.guestName; 我得到以下输出: 如何删除前两列中不重复的所有行 输出为文字,仅当所有客人在同一家酒店住过不止一次时,才获取所

我目前有这个SQL查询和这个输出

SELECT b.HotelNo,g.guestName,b.dateFrom,b.dateToFrom Booking b, Guest g
FROM Booking b, Guest g
WHERE b.guestNo = g.guestNo
GROUP BY b.hotelNo,b.dateFrom,b.dateTo,g.guestName;
我得到以下输出:

如何删除前两列中不重复的所有行

输出为文字,仅当所有客人在同一家酒店住过不止一次时,才获取所有酒店号码、客人姓名和入住日期:

1234 John Doe 2017-02-01 00:00:00.000 2017-02-28 00:00:00.000
1234 John Doe 2017-03-16 00:00:00.000 2017-03-21 00:00:00.000
编辑: 我得到了我想要的,但当我在select语句中添加b.dateFrom,b.dateTo时,我失败了。我收到一个错误消息:“Booking.dateFrom”列在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中

这是获取此错误的SQL查询:

SELECT b.hotelNo,g.guestName,b.dateFrom,b.dateTo 
FROM Booking b, Guest g 
WHERE b.guestNo = g.guestNo
GROUP BY b.hotelNo,g.guestName 
HAVING COUNT(*) > 1;

如果我加上我需要的两个列名,我会得到上面的错误。如何在不出错的情况下添加它们?

如果您不介意根据order子句只从first或last中选择一个日期,那么您可以为每行分配一个行号,并按前两列进行分区。 然后,只拾取具有相同前两列的每个组RN=1的第一行

WITH CTE AS
( SELECT ROW_NUMBER()   
          OVER ( PARTITION BY b.HotelNo,g.guestName 
            ORDER BY b.dateFrom) AS RN,
         b.HotelNo,g.guestName,b.dateFrom,b.dateTo
  FROM Booking b, Guest g
  WHERE b.guestNo = g.guestNo
  GROUP BY b.hotelNo,b.dateFrom,b.dateTo,g.guestName;
)
SELECT HotelNo,guestName,dateFrom,dateToFrom 
WHERE RN=1

您可以阅读更多

如果您只想要那些在酒店住过一次以上的人,请使用JOIN或EXISTS子句检查计数是否大于2

使用存在:

使用连接但相同的原则:

SELECT DISTINCT b.hotelNo,g.guestName,b.dateFrom,b.dateTo 
FROM Booking AS b
JOIN Guest AS g 
    ON b.guestNo = g.guestNo
JOIN
(
    SELECT hotelNo, guestNo
    FROM Booking
    GROUP BY hotelNo, guestNo
    HAVING COUNT(*) > 1
) AS j
    ON j.hotelNo = b.hotelNo
    AND j.guestNo = b.guestNo;

注意:我不确定您的列是否需要DISTINCT或GROUP BY,除非您的表中确实有重复项,如果有,您可能应该消除这些重复项。

您能澄清一下吗?您的声明,如何删除所有不重复的行。。。显示重复数据消除。你的陈述得到。。。除非他们在同一家酒店住过不止一次。表示只保留副本。@M.K.Hunter,因此我将其放在上面的图片中,因为您可以看到John Doe住在同一家酒店,酒店号码为1234,但其他客人都没有在同一家酒店住过一次以上。我想保留图片中的第一行和第三行,并过滤掉其余的行。首先,作为一般规则,您应该使用显式的连接语法,例如,从b.guestNo=g.guestNo上以b.join Guest as g预订。至于您的问题,一种方法是加入或使用exists只选择那些计数大于2的人。e、 g.如果存在,则从预订中选择1,其中hotelno=b。hotelno和guestno=b。guestno按hotelno分组,guestno的计数*>1。Join语法可能如下所示:Join SELECT hotelno,hotelno从预订组中选择guestno,guestno的计数*>1,J.hotelno=B.hotelno和J.guestno=B.guestno.@ZLK我尝试了你的,但没有完全起作用,但我添加了计数*。请参阅编辑部分下方的编辑部分。如果我不清楚,请原谅,但我将添加我实际建议的答案。
SELECT DISTINCT b.hotelNo,g.guestName,b.dateFrom,b.dateTo 
FROM Booking AS b
JOIN Guest AS g 
    ON b.guestNo = g.guestNo
JOIN
(
    SELECT hotelNo, guestNo
    FROM Booking
    GROUP BY hotelNo, guestNo
    HAVING COUNT(*) > 1
) AS j
    ON j.hotelNo = b.hotelNo
    AND j.guestNo = b.guestNo;