SQL 联接表对每个集合仅应用一次值
SQL Join Tables Apply Value Only Once To Each Set
我需要将两个 table 连接在一起。但是,要连接的 table 只能将其值应用于具有相同值的一组行。这就是我的意思...
TABLE 我想要的加入如下
** LOGGED HOURS ** ** SICK HOURS ** ** RESULT TABLE **
+--------+-------+ +--------+-------+ +--------+-------+-------+
|Name | Hours | |Name | Hours | |Name |Hours |Sick |
+--------+-------+ +--------+-------+ +--------+-------+-------+
|David |47 | |David |9 | |David |47 |9 |
+--------+-------+ +--------+-------+ +--------+-------+-------+
|David |9 | |David |9 |0 |
+--------+-------+ +--------+-------+-------+
正常左侧 TABLE 加入结果:
** LOGGED HOURS ** ** SICK HOURS ** ** RESULT TABLE **
+--------+-------+ +--------+-------+ +--------+-------+-------+
|Name | Hours | |Name | Hours | |Name |Hours |Sick |
+--------+-------+ +--------+-------+ +--------+-------+-------+
|David |47 | |David |9 | |David |47 |9 |
+--------+-------+ +--------+-------+ +--------+-------+-------+
|David |9 | |David |9 |9 |
+--------+-------+ +--------+-------+-------+
注意,9 应用于正常左 table 连接中的每一行。我希望 9 仅应用于名称为 DAVID 的行集。
如有任何问题,请随时联系,谢谢。
编辑:如果您要对我的问题投反对票,请礼貌地解释为什么以及我将来如何改进我的问题。谢谢。
由于您只想为每个 "Name" 记录一个病假时间并且选择可以是任意的,您可以使用 Window 函数:
SELECT
LoggedHours.Name,
LoggedHours.Hours,
CASE WHEN ROW_NUMBER() OVER (PARTITION BY LoggedHours.Name ORDER BY 1) = 1 THEN SickHours.Hours ELSE NULL END AS SickHoursLogged
FROM
LoggedHours LEFT OUTER JOIN SickHours on LoggedHours.Name = SickHours.Name
所以... Window/Analytics 函数说:
Split the result set by Name (group of records with "David" for
example) and order them by whatever. Then give that group of records
row numbers starting at 1. If this particular record is row 1, then it
gets the sick hours from the SickHours
table. Otherwise it gets
Null.
如果...您不希望它是任意的,而是希望每个人的病假记录时间最长的记录,您可以将 ROW_NUMBER() 函数更改为:
ROW_NUMBER() OVER (PARTITION BY LoggedHours.Name ORDER BY LoggedHours.Hours DESC) = 1
我需要将两个 table 连接在一起。但是,要连接的 table 只能将其值应用于具有相同值的一组行。这就是我的意思...
TABLE 我想要的加入如下
** LOGGED HOURS ** ** SICK HOURS ** ** RESULT TABLE ** +--------+-------+ +--------+-------+ +--------+-------+-------+ |Name | Hours | |Name | Hours | |Name |Hours |Sick | +--------+-------+ +--------+-------+ +--------+-------+-------+ |David |47 | |David |9 | |David |47 |9 | +--------+-------+ +--------+-------+ +--------+-------+-------+ |David |9 | |David |9 |0 | +--------+-------+ +--------+-------+-------+
正常左侧 TABLE 加入结果:
** LOGGED HOURS ** ** SICK HOURS ** ** RESULT TABLE ** +--------+-------+ +--------+-------+ +--------+-------+-------+ |Name | Hours | |Name | Hours | |Name |Hours |Sick | +--------+-------+ +--------+-------+ +--------+-------+-------+ |David |47 | |David |9 | |David |47 |9 | +--------+-------+ +--------+-------+ +--------+-------+-------+ |David |9 | |David |9 |9 | +--------+-------+ +--------+-------+-------+
注意,9 应用于正常左 table 连接中的每一行。我希望 9 仅应用于名称为 DAVID 的行集。
如有任何问题,请随时联系,谢谢。
编辑:如果您要对我的问题投反对票,请礼貌地解释为什么以及我将来如何改进我的问题。谢谢。
由于您只想为每个 "Name" 记录一个病假时间并且选择可以是任意的,您可以使用 Window 函数:
SELECT
LoggedHours.Name,
LoggedHours.Hours,
CASE WHEN ROW_NUMBER() OVER (PARTITION BY LoggedHours.Name ORDER BY 1) = 1 THEN SickHours.Hours ELSE NULL END AS SickHoursLogged
FROM
LoggedHours LEFT OUTER JOIN SickHours on LoggedHours.Name = SickHours.Name
所以... Window/Analytics 函数说:
Split the result set by Name (group of records with "David" for example) and order them by whatever. Then give that group of records row numbers starting at 1. If this particular record is row 1, then it gets the sick hours from the
SickHours
table. Otherwise it gets Null.
如果...您不希望它是任意的,而是希望每个人的病假记录时间最长的记录,您可以将 ROW_NUMBER() 函数更改为:
ROW_NUMBER() OVER (PARTITION BY LoggedHours.Name ORDER BY LoggedHours.Hours DESC) = 1